Hvordan bygge et 3D-mesh programmatisk i TypeScript
Aspose.3D FOSS for TypeScript lar deg bygge 3D-geometri helt i kode uten å laste inn noen fil. Du definerer vertex‑posisjoner som kontrollpunkter, spesifiserer polygonflater ved indeks, og legger ved valgfrie vertex‑elementer som normaler, UV‑er eller vertex‑farger. Resultatet kan lagres i ethvert skrivbart format: glTF, GLB, STL, FBX eller COLLADA.
Forutsetninger
- Node.js 18 eller nyere
- TypeScript 5.0 eller nyere
@aspose/3dinstallert (se trinn 1)
Steg-for-steg guide
Trinn 1: Installer @aspose/3d
npm install @aspose/3dIngen native‑tillegg eller systembiblioteker er påkrevd. Pakken inkluderer TypeScript‑type‑definisjoner.
Minimum tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Trinn 2: Opprett en scene og node
A Scene er den øverste beholderen. All geometrien må festes til en Node i scenetreet:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) oppretter en navngitt node og kobler den som et barn av den nåværende noden. Det returnerte Node‑objektet er hvor du vil feste mesh i trinn 7.
Trinn 3: Opprett et Mesh-objekt
Mesh inneholder vertex‑posisjoner og polygon‑definisjoner. Konstruer en med et valgfritt navn:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');Meshen starter tom: ingen vertices og ingen faces. Du legger dem til i de neste trinnene.
Steg 4: Legg til kontrollpunkter (hjørner)
Kontrollpunkter er vertex‑posisjonene i lokalt rom. Skyv Vector4‑verdier inn i mesh.controlPoints. Den fjerde komponenten (w) er 1 for posisjoner:
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 posisjonene ved deres nullbaserte indeks når du definerer polygonflater.
Trinn 5: Opprett polygonflater
createPolygon() definerer en flate ved å liste opp vertex‑indeksene i rekkefølge. Tre indekser lager en trekant:
mesh.createPolygon(0, 1, 2);Du kan også definere quads (fire indekser) eller vilkårlige polygoner for formater som støtter dem. For glTF vil biblioteket automatisk triangulere quads og n-gons ved eksport.
Trinn 6: Legg til Vertex Normals
Normale forbedrer gjengivelseskvaliteten. Bruk mesh.createElement() for å opprette en VertexElementNormal, samle normalvektorer i en matrise, og kall deretter setData() for å lagre dem. data-getteren returnerer en defensiv kopi — å pushe til den har ingen effekt. Bruk FVector3 (flyttall med enkel presisjon) for 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 betyr én normal per vertex. ReferenceMode.DIRECT betyr at dataarrayet er indeksert direkte av polygon‑vertex‑indeksen.
Trinn 7: Fest Mesh og lagre til glTF
Tildel mesh til noden via node.entity, så lagre 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 å produsere en enkelt selvstendig .glb‑fil i stedet, sett saveOpts.binaryMode = true og endre utdatafilens filtype til .glb.
Fullstendig eksempel
Følgende er det komplette skriptet som kombinerer alle trinnene 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');Kjør med ts-node:
npx ts-node triangle.tsVanlige problemer
| Issue | Cause | Fix |
|---|---|---|
mesh.controlPoints.length er 0 etter push | Mesh er ikke referert av noen node | Push før du tilordner node.entity; rekkefølgen spiller ingen rolle, men verifiser referansen |
| Eksport gir tom geometri | node.entity er ikke tilordnet | Sørg for node.entity = mesh før du kaller scene.save() |
| Uoverensstemmelse i antall normaler | Array sendt til setData() er kortere enn controlPoints | Legg til én FVector3-oppføring per kontrollpunkt når du bruker MappingMode.CONTROL_POINT |
| glTF-viseren viser svart mesh | Normaler peker innover | Vend om winding-rekkefølgen i createPolygon (f.eks., 0, 2, 1) eller neger normalvektorene |
| TypeScript: ’normals.data’-egenskap ikke funnet | Feil importsti | Importer VertexElementNormal fra @aspose/3d/entities, ikke fra @aspose/3d-roten |
Ofte stilte spørsmål
Kan jeg lage firkanter i stedet for trekanter?
Ja. Send fire indekser til createPolygon(0, 1, 2, 3). Biblioteket triangulerer firkanter under eksport til formater som krever trekanter (glTF, STL).
Hva er forskjellen mellom MappingMode.CONTROL_POINT og MappingMode.POLYGON_VERTEX?CONTROL_POINT lagrer én verdi per unik vertex. POLYGON_VERTEX lagrer én verdi per polygon-vertex pair, noe som tillater forskjellige normaler på samme vertex når den tilhører flere polygoner (hard edges).
Må jeg triangulere nettet før jeg lagrer til STL?
Nei. Biblioteket håndterer triangulering automatisk når du eksporterer til formater som krever trekanter. Du kan definere kvadrater og n‑goner i nettet og lagre til STL direkte.
Hvordan legger jeg til UV-koordinater?
Bruk mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) for å opprette en VertexElementUV, og kall deretter setData([...]) med en matrise av FVector2‑ eller FVector3‑verdier — én per kontrollpunkt. data‑getteren returnerer en kopi; ikke skyv direkte til den.
Kan jeg bygge flere mesh i én scene?
Ja. Opprett flere noder under scene.rootNode og tilordne en separat Mesh til hver nodes entity‑egenskap.