Sådan bygger du et 3D‑mesh programmatisk i TypeScript

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/3d installeret (se trin 1)

Trin-for-trin guide

Trin 1: Installer @aspose/3d

npm install @aspose/3d

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

Almindelige problemer

IssueCauseFix
mesh.controlPoints.length er 0 efter pushMesh er ikke refereret af nogen nodePush før tildeling af node.entity; rækkefølgen betyder ikke noget, men verificer referencen
Eksport producerer tom geometrinode.entity er ikke tildeltSørg for node.entity = mesh før du kalder scene.save()
Mismatch i antal normalerArray sendt til setData() er kortere end controlPointsTilføj én FVector3 post per kontrolpunkt når du bruger MappingMode.CONTROL_POINT
glTF-fremviser viser sort meshNormaler peger indadVend winding‑ordren i createPolygon (f.eks. 0, 2, 1) eller negér normalvektorer
TypeScript: Egenskaben ’normals.data’ blev ikke fundetForkert importstiImporté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.

Se også

 Dansk