Sådan bygger du et 3D‑mesh programmatisk i TypeScript
Aspose.3D FOSS for TypeScript giver dig mulighed for at bygge 3D-geometri udelukkende i kode uden at indlæse nogen fil. Du definerer vertex‑positioner som kontrolpunkter, specificerer polygon‑flader ved indeks, og vedhæfter valgfrie vertex‑elementer såsom normals, UVs eller vertex‑colors. Resultatet kan gemmes i ethvert skrivbart format: glTF, GLB, STL, FBX eller COLLADA.
Forudsætninger
- Node.js 18 eller nyere
- TypeScript 5.0 eller nyere
@aspose/3dinstalleret (se trin 1)
Trin-for-trin guide
Trin 1: Installer @aspose/3d
npm install @aspose/3dIngen native‑tilføjelser eller systembiblioteker er påkrævet. Pakken inkluderer TypeScript‑typedefinitioner.
Minimum tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Trin 2: Opret en Scene og Node
En Scene er den øverste container. Al geometri skal vedhæftes en Node inde i scenetræet:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) opretter en navngivet node og tilslutter den som et barn af den aktuelle node. Det returnerede Node‑objekt er, hvor du vil vedhæfte mesh’en i trin 7.
Trin 3: Opret et Mesh-objekt
Mesh indeholder vertex‑positioner og polygondefinitioner. Opret en med et valgfrit navn:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');Mesh’en starter tom: ingen vertexer og ingen flader. Du tilføjer dem i de næste trin.
Trin 4: Tilføj kontrolpunkter (hjørner)
Kontrolpunkter er vertexpositionerne i lokalt rum. Skub Vector4 værdier ind i mesh.controlPoints. Den fjerde komponent (w) er 1 for positioner:
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
Du refererer til disse positioner ved deres nulbaserede indeks, når du definerer polygonflader.
Trin 5: Opret polygonflader
createPolygon() definerer en flade ved at liste vertex‑indekserne i rækkefølge. Tre indekser udgør en trekant:
mesh.createPolygon(0, 1, 2);Du kan også definere quads (fire indekser) eller vilkårlige polygoner for formater, der understøtter dem. For glTF vil biblioteket automatisk triangulere quads og n-gons ved eksport.
Trin 6: Tilføj Vertex Normals
Normale forbedrer gengivelseskvaliteten. Brug mesh.createElement() til at oprette en VertexElementNormal, indsamle normalvektorer i et array, og derefter kalde setData() for at gemme dem. data-getteren returnerer en defensiv kopi — at skubbe til den har ingen effekt. Brug FVector3 (single-precision float) til normaldata, ikke Vector4.
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 betyder én normal pr. vertex. ReferenceMode.DIRECT betyder, at dataarrayet er indekseret direkte efter polygon‑vertex‑indekset.
Trin 7: Tilføj mesh’en og gem som glTF
Tildel mesh’en til noden via node.entity, og gem derefter scenen:
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');For at producere en enkelt selvstændig .glb fil i stedet, skal du indstille saveOpts.binaryMode = true og ændre outputfilens filendelse til .glb.
Komplett eksempel
Følgende er det fulde script, der kombinerer alle trin ovenfor:
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');Kør med ts-node:
npx ts-node triangle.tsAlmindelige problemer
| Issue | Cause | Fix |
|---|---|---|
mesh.controlPoints.length er 0 efter push | Mesh er ikke refereret af nogen node | Push før tildeling af node.entity; rækkefølgen betyder ikke noget, men verificer referencen |
| Eksport producerer tom geometri | node.entity er ikke tildelt | Sørg for node.entity = mesh før du kalder scene.save() |
| Mismatch i antal normaler | Array sendt til setData() er kortere end controlPoints | Tilføj én FVector3 post per kontrolpunkt når du bruger MappingMode.CONTROL_POINT |
| glTF-fremviser viser sort mesh | Normaler peger indad | Vend winding‑ordren i createPolygon (f.eks. 0, 2, 1) eller negér normalvektorer |
| TypeScript: Egenskaben ’normals.data’ blev ikke fundet | Forkert importsti | Importér VertexElementNormal fra @aspose/3d/entities, ikke fra @aspose/3d‑roden |
Ofte stillede spørgsmål
Kan jeg oprette quads i stedet for trekanter?
Ja. Send fire indekser til createPolygon(0, 1, 2, 3). Biblioteket triangulerer quads under eksport til formater, der kræver trekanter (glTF, STL).
Hvad er forskellen mellem MappingMode.CONTROL_POINT og MappingMode.POLYGON_VERTEX?CONTROL_POINT gemmer én værdi pr. unik vertex. POLYGON_VERTEX gemmer én værdi pr. polygon‑vertex‑par, hvilket tillader forskellige normaler på den samme vertex, når den tilhører flere polygoner (harde kanter).
Skal jeg triangulere mesh’en, før jeg gemmer til STL? Nej. Biblioteket håndterer triangulering automatisk, når der eksporteres til formater, der kræver trekanter. Du kan definere quads og n-gons i mesh’en og gemme direkte til STL.
Hvordan tilføjer jeg UV-koordinater?
Brug mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) til at oprette en VertexElementUV, og kald derefter setData([...]) med et array af FVector2 eller FVector3 værdier — én per kontrolpunkt. data-getteren returnerer en kopi; skub ikke direkte til den.
Kan jeg bygge flere mesh i én scene?
Ja. Opret flere noder under scene.rootNode og tildel en separat Mesh til hver nodes entity-egenskab.