TypeScript'te Programlı Şekilde 3D Mesh Nasıl Oluşturulur
Aspose.3D FOSS for TypeScript, herhangi bir dosya yüklemeden tamamen kod içinde 3D geometri oluşturmanıza olanak tanır. Vertex konumlarını kontrol noktaları olarak tanımlarsınız, çokgen yüzeylerini indeksle belirtebilir ve normal, UV veya vertex renkleri gibi isteğe bağlı vertex öğelerini ekleyebilirsiniz. Sonuç, herhangi bir yazılabilir formata kaydedilebilir: glTF, GLB, STL, FBX, veya COLLADA.
Önkoşullar
- Node.js 18 veya daha yeni bir sürüm
- TypeScript 5.0 veya daha yeni bir sürüm
@aspose/3dyüklü (Adım 1’e bakın)
Adım Adım Kılavuz
Adım 1: @aspose/3d’yi kurun
npm install @aspose/3dYerel eklentiler veya sistem kütüphaneleri gerekmez. Paket, TypeScript tip tanımlarını içerir.
Minimum tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Adım 2: Bir Sahne ve Düğüm Oluştur
Scene üst düzey bir kapsayıcıdır. Tüm geometri, sahne ağacının içinde bir Node‘ye eklenmelidir:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) adlandırılmış bir düğüm oluşturur ve bunu mevcut düğümün çocuğu olarak bağlar. Döndürülen Node nesnesi, 7. adımda ağı ekleyeceğiniz yerdir.
Adım 3: Bir Mesh Nesnesi Oluştur
Mesh köşe konumlarını ve çokgen tanımlarını tutar. İsteğe bağlı bir adla bir tane oluşturun:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');Mesh boş başlar: köşe ve yüz yok. Bunları sonraki adımlarda eklersiniz.
Adım 4: Kontrol Noktalarını (Köşe Noktaları) Ekle
Kontrol noktaları, yerel uzaydaki köşe konumlarıdır. Vector4 değerlerini mesh.controlPoints içine it. Dördüncü bileşen (w), konumlar için 1‘dir.
import { Vector4 } from '@aspose/3d/utilities';
mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0)); // index 0
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0)); // index 1
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0)); // index 2
Poligon yüzeylerini tanımlarken bu konumlara sıfır tabanlı indeksleriyle başvurursunuz.
Adım 5: Çokgen Yüzeyleri Oluştur
createPolygon() bir yüzeyi, köşe indislerini sırayla listeleyerek tanımlar. Üç indis bir üçgen oluşturur:
mesh.createPolygon(0, 1, 2);Ayrıca, destekleyen formatlar için dörtgenleri (dört indeks) veya keyfi çokgenleri tanımlayabilirsiniz. glTF için, kütüphane dışa aktarım sırasında dörtgenleri ve n‑gonları otomatik olarak üçgenleştirir.
Adım 6: Vertex Normal’ları Ekle
Normal vektörler, render kalitesini artırır. mesh.createElement() kullanarak bir VertexElementNormal oluşturun, normal vektörleri bir diziye toplayın, ardından onları saklamak için setData() çağırın. data alıcı (getter) savunmacı bir kopya döndürür — ona push yapmak hiçbir etki yaratmaz. Normal veriler için FVector3 (tek duyarlıklı kayan nokta) kullanın, Vector4 değil.
import { VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { FVector3 } from '@aspose/3d/utilities';
const normals = mesh.createElement(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
) as VertexElementNormal;
// Build the normal array, then call setData() — do NOT push to normals.data
normals.setData([
new FVector3(0, 0, 1), // normal for vertex 0 (pointing +Z)
new FVector3(0, 0, 1), // normal for vertex 1
new FVector3(0, 0, 1), // normal for vertex 2
]);MappingMode.CONTROL_POINT bir köşe başına bir normal anlamına gelir. ReferenceMode.DIRECT veri dizisinin çokgen köşe indeksine doğrudan indekslendiği anlamına gelir.
Adım 7: Mesh’i Bağlayın ve glTF’ye Kaydedin
Mesh’i düğüme node.entity aracılığıyla atayın, ardından sahneyi kaydedin:
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
node.entity = mesh;
const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');Bunun yerine tek bir kendi içinde barındıran .glb dosyası üretmek için, saveOpts.binaryMode = true ayarlayın ve çıktı dosya uzantısını .glb olarak değiştirin.
Tam Örnek
Aşağıdaki, yukarıdaki tüm adımları birleştiren tam betiktir:
import { Scene } from '@aspose/3d';
import { Mesh, VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { Vector4, FVector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');
const mesh = new Mesh('triangle');
mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0));
mesh.createPolygon(0, 1, 2);
const normals = mesh.createElement(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
) as VertexElementNormal;
// setData() is the correct API — normals.data returns a defensive copy; pushing to it has no effect
normals.setData([
new FVector3(0, 0, 1),
new FVector3(0, 0, 1),
new FVector3(0, 0, 1),
]);
node.entity = mesh;
const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');ts-node ile çalıştır:
npx ts-node triangle.tsYaygın Sorunlar
| Issue | Cause | Fix |
|---|---|---|
mesh.controlPoints.length itme (push) sonrası 0 | Ağ (mesh) hiçbir düğüm tarafından referans alınmamış | node.entity atanmadan önce itme yapın; sıra önemli değildir, ancak referansı doğrulayın |
| Dışa aktarım boş geometri üretiyor | node.entity atanmadı | scene.save() çağırmadan önce node.entity = mesh olduğundan emin olun |
| Normal sayısı eşleşmiyor | setData()‘ye geçirilen dizi controlPoints‘den daha kısa | MappingMode.CONTROL_POINT kullanırken her kontrol noktası için bir FVector3 girişi ekleyin |
| glTF görüntüleyicisi siyah ağ gösteriyor | Normal vektörler içe doğru yönelmiş | createPolygon‘de sarmalama sırasını ters çevirin (ör. 0, 2, 1) veya normal vektörleri negatif yapın |
| TypeScript: ’normals.data’ özelliği bulunamadı | Yanlış içe aktarma yolu | VertexElementNormal‘i @aspose/3d/entities‘den içe aktarın, @aspose/3d kökünden değil |
Sıkça Sorulan Sorular
Üçgenler yerine dörtgenler oluşturabilir miyim?
Evet. Dört indeksi createPolygon(0, 1, 2, 3)‘e gönderin. Kütüphane, üçgen gerektiren formatlara (glTF, STL) dışa aktarırken dörtgenleri üçgene çevirir.
MappingMode.CONTROL_POINT ve MappingMode.POLYGON_VERTEX arasındaki fark nedir?CONTROL_POINT her benzersiz köşe başına bir değer saklar. POLYGON_VERTEX her çokgen‑köşe çifti başına bir değer saklar; bu, köşe birden fazla çokgene ait olduğunda aynı köşede farklı normallerin (sert kenarlar) olmasını sağlar.
STL’ye kaydetmeden önce mesh’i üçgenleştirmem gerekiyor mu?
Hayır. Kütüphane, üçgen gerektiren formatlara dışa aktarırken üçgenleştirmeyi otomatik olarak gerçekleştirir. Mesh içinde dörtgen ve n‑gon tanımlayabilir ve doğrudan STL olarak kaydedebilirsiniz.
UV koordinatlarını nasıl eklerim?mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) kullanarak bir VertexElementUV oluşturun, ardından setData([...])‘i FVector2 veya FVector3 değerlerinden oluşan bir diziyle çağırın — kontrol noktası başına bir. data getter’ı bir kopya döndürür; ona doğrudan push yapmayın.
Bir sahnede birden fazla ağ oluşturabilir miyim?
Evet. scene.rootNode altında birden fazla düğüm oluşturun ve her düğümün entity özelliğine ayrı bir Mesh atayın.