Hogyan építsünk 3D hálót programozottan TypeScript-ben

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/3d telepí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/3d

Nem 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.ts

Gyakori problémák

IssueCauseFix
mesh.controlPoints.length 0 a push utánA háló nincs hivatkozva egyetlen csomópontra semPush előtt rendeld hozzá node.entity; a sorrend nem számít, de ellenőrizd a hivatkozást
Az export üres geometriát eredményeznode.entity nincs hozzárendelveGyőződj meg róla, hogy node.entity = mesh a scene.save() hívása előtt
Normál szám eltérésA setData()-nek átadott tömb rövidebb, mint a controlPointsAdj hozzá egy FVector3 bejegyzést kontrollpontonként, ha MappingMode.CONTROL_POINT-t használod
A glTF megjelenítő fekete hálót mutatA normálok befelé mutatnakFordí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 útvonalImportá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.

Lásd még

 Magyar