Hogyan építsünk 3D hálót programozottan TypeScript-ben
Aspose.3D FOSS for TypeScript lehetővé teszi, hogy teljesen kódból építs 3D geometriát anélkül, hogy bármilyen fájlt betöltenél. A csúcspontok pozícióit vezérlőpontként definiálod, a poligon felületeket index alapján adod meg, és opcionálisan csatlakoztathatsz csúcspont elemeket, mint például normálvektorok, UV-k vagy csúcspont színek. Az eredmény bármely írható formátumba menthető: glTF, GLB, STL, FBX vagy COLLADA.
Előfeltételek
- Node.js 18 vagy újabb
- TypeScript 5.0 vagy újabb
@aspose/3dtelepítve (lásd az 1. lépést)
Lépésről‑lépésre útmutató
1. lépés: Telepítse az @aspose/3d
npm install @aspose/3dNem szükségesek natív kiegészítők vagy rendszerkönyvtárak. A csomag tartalmaz TypeScript típusdefiníciókat.
Minimum tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}2. lépés: Jelenet és csomópont létrehozása
A Scene a legfelső szintű tároló. Minden geometriát a jelenetfában egy Node-hez kell csatolni:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) létrehoz egy elnevezett csomópontot, és gyermekként csatlakoztatja azt az aktuális csomóponthoz. A visszaadott Node objektum az, ahol a 7. lépésben csatolni fogja a mesh-et.
3. lépés: Mesh Object létrehozása
Mesh csúcshelyzeteket és sokszögdefiníciókat tartalmaz. Hozzon létre egyet opcionális névvel:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');A háló üresen indul: nincsenek csúcsok és nincsenek felületek. A következő lépésekben adod hozzá őket.
4. lépés: Vezérlőpontok (csúcsok) hozzáadása
A vezérlőpontok a csúcshelyzetek helyi térben. Tolja a Vector4 értékeket a mesh.controlPoints‑ba. A negyedik komponens (w) 1 a pozíciókhoz:
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
A polygonok felületeinek meghatározásakor ezekre a pozíciókra a nullától induló indexük alapján hivatkozol.
5. lépés: Sokszög felületek létrehozása
createPolygon() egy felületet definiál a csúcspont-indexek sorrendjének felsorolásával. Három index egy háromszöget alkot:
mesh.createPolygon(0, 1, 2);A támogatott formátumok esetén quads (négy index) vagy tetszőleges sokszögeket is definiálhat. A glTF esetében a könyvtár automatikusan háromszögezi a quads és az n‑gonokat exportáláskor.
6. lépés: Csúcsnormálok hozzáadása
A normálok javítják a renderelés minőségét. Használja a mesh.createElement()‑t egy VertexElementNormal létrehozásához, gyűjtse össze a normálvektorokat egy tömbbe, majd hívja a setData()‑t a tárolásukhoz. A data lekérdező védelmi másolatot ad vissza — a tömbhöz való pusholásnak nincs hatása. Használja a FVector3‑t (egyes pontosságú lebegőpontos) a normál adatokhoz, ne a Vector4‑t.
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 azt jelenti, hogy csúcsonként egy normál van. ReferenceMode.DIRECT azt jelenti, hogy az adat tömböt közvetlenül a sokszög csúcs indexe alapján indexelik.
7. lépés: A háló csatolása és mentés glTF-be
Rendelje hozzá a hálót a csomóponthoz a node.entity segítségével, majd mentse a jelenetet:
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');Ehelyett egyetlen önálló .glb fájl előállításához állítsa be saveOpts.binaryMode = true-t, és változtassa meg a kimeneti fájl kiterjesztését .glb-re.
Teljes példa
Az alábbi a teljes szkript, amely összevonja a fentieket:
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');Futtatás a ts-node-val:
npx ts-node triangle.tsGyakori problémák
| Issue | Cause | Fix |
|---|---|---|
mesh.controlPoints.length 0 a push után | A háló nincs hivatkozva egyetlen csomópontra sem | Push előtt rendeld hozzá node.entity; a sorrend nem számít, de ellenőrizd a hivatkozást |
| Az export üres geometriát eredményez | node.entity nincs hozzárendelve | Győződj meg róla, hogy node.entity = mesh a scene.save() hívása előtt |
| Normál szám eltérés | A setData()-nek átadott tömb rövidebb, mint a controlPoints | Adj hozzá egy FVector3 bejegyzést kontrollpontonként, ha MappingMode.CONTROL_POINT-t használod |
| A glTF megjelenítő fekete hálót mutat | A normálok befelé mutatnak | Fordítsd meg a csavart sorrendet a createPolygon-ben (pl. 0, 2, 1) vagy negáld a normálvektorokat |
| TypeScript: a ’normals.data’ tulajdonság nem található | Helytelen import útvonal | Importáld a VertexElementNormal-t a @aspose/3d/entities-ből, ne a @aspose/3d gyökérből |
Gyakran Ismételt Kérdések
Létrehozhatok négyszögeket háromszögek helyett?
Igen. Adjon át négy indexet a createPolygon(0, 1, 2, 3)-nek. A könyvtár négyszögeket háromszögekké alakít exportáláskor olyan formátumokba, amelyek háromszögeket igényelnek (glTF, STL).
Mi a különbség a MappingMode.CONTROL_POINT és a MappingMode.POLYGON_VERTEX között?
CONTROL_POINT egy értéket tárol minden egyedi csúcsponthoz. POLYGON_VERTEX egy értéket tárol minden sokszög‑csúcs párhoz, ami lehetővé teszi, hogy ugyanazon csúcspontnál különböző normálok legyenek, ha több sokszöghez tartozik (kemény élek).
Szükséges-e a hálót háromszögekre bontani, mielőtt STL-be mentenénk?
Nem. A könyvtár automatikusan kezeli a háromszögelést, amikor olyan formátumokba exportál, amelyek háromszögeket igényelnek. Meghatározhat négyzeteket és n‑gonokat a hálóban, és közvetlenül STL‑be menthet.
Hogyan adhatok hozzá UV koordinátákat?
Használja a mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT)-t egy VertexElementUV létrehozásához, majd hívja meg a setData([...])-t egy FVector2 vagy FVector3 értékekből álló tömbbel – egyet minden vezérlőponthoz. A data lekérdező egy másolatot ad vissza; ne nyomja bele közvetlenül.
Létrehozhatok több hálót egy jelenetben?
Igen. Hozzon létre több csomópontot a scene.rootNode alatt, és rendelje hozzá egy külön Mesh‑t minden csomópont entity tulajdonságához.