Hur man bygger en 3D Mesh Programmatiskt i TypeScript
Aspose.3D FOSS för TypeScript låter dig bygga 3D geometri helt i kod utan att ladda någon fil. Du definierar vertexpositioner som kontrollpunkter, anger polygon ansikten per index och bifogar valfria verteselement såsom normala, UVs eller vertekfärger. Resultatet kan sparas till något skrivbart format: glTF, GLB, STL, FBX, eller COLLADA.
Förutsättningar
- Node.js 18 eller senare
- TypScript 5.0 eller senare
@aspose/3dinstallerad (se steg 1)
Steg för steg guide
Steg 1: Installera @aspose/3d
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Inga inhemska addon eller systembibliotek krävs. paketet innehåller TypeScript-typdefinitioner.
Minimum tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Steg 2: Skapa en scen och noder
A och Scene är den högsta nivån container. all geometri måste anslutas till en Node Inuti trädet:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) skapar en namngiven nod och strömmar den som ett barn av den aktuella noden. Node objektet är där du kommer att fästa mesh i steg 7.
Steg 3: Skapa ett Mesh Object
Mesh Håller vertexpositioner och polygon definitioner. Konstruera en med ett valfritt namn:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');Mässa börjar tom: inga vertikaler och inga ansikten. Du lägger till dem i nästa steg.
Steg 4: Lägg till kontrollpunkter (vertikaler)
Kontrollpunkter är de vertikala positionerna i lokal utrymme. Vector4 Värden i mesh.controlPoints.Den fjärde delen (w) är 1 För 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 refererar till dessa positioner genom deras nollbaserade index när du definierar polygon ansikten.
Steg 5: Skapa polygon ansikten
createPolygon() definierar ett ansikte genom att lista vertexindex i ordning.Tre index gör en triangel:
mesh.createPolygon(0, 1, 2);Du kan också definiera quads (fem index) eller arbitrariska polygoner för format som stöder dem. För glTF kommer biblioteket automatiskt att triangulera quad och n-gons på export.
Steg 6: Lägg till Vertex normaler
Normala förbättrar rendering kvalitet. användning mesh.createElement() För att skapa en VertexElementNormal, samla normala vektorer i en rad, sedan ringa setData() för att hålla dem. den data getter returnerar en försvarskopia – att trycka på det har ingen effekt. FVector3 (enhetlig precision) för normala data, inte 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 Det är en normal per vertex. ReferenceMode.DIRECT Det betyder att dataråget indexeras direkt av polygonvertexindexet.
Steg 7: Anslut Mesh och Spara till glTF
Tilldela mesh till knuten via node.entity,Så spara 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');Att producera en enda självinnehållande .glb filer istället, ställ in saveOpts.binaryMode = true och ändra utgångsfil förlängning till .glb.
Fullständigt exempel
Följande är den fullständiga skriptet som kombinerar alla steg ovan:
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');Resa med ts-node:
npx ts-node triangle.tsVanliga frågor
| Problemet | orsaker | Fixar |
|---|---|---|
mesh.controlPoints.length 0 efter push | Mesh inte hänvisas till någon node | Push innan tilldelning node.entity;ordning spelar ingen roll, men kontrollera referensen |
| Exporten ger tom geometri | node.entity inte tilldelas | Säkerhet node.entity = mesh Innan du ringer scene.save() |
| Normal räkning missmatch | Array gick över till setData() korta än controlPoints | Lägg till ett FVector3 Inträde per kontrollpunkt när du använder MappingMode.CONTROL_POINT |
| GlTF-visa visar svart mesh | Normala riktningar inuti | Omvända vindriktning i createPolygon (t.ex . är det., 0, 2, 1• Förnekar vanliga vectorer |
| TypeScript: ’normals.data’ egendom inte hittad | Fel väg till import | Import av VertexElementNormal från @aspose/3d/entities,Inte från @aspose/3d Röda |
Ofta ställda frågor
Kan jag skapa quads istället för trianglar? Ja, pass fyra indikationer till createPolygon(0, 1, 2, 3).Biblioteket triangulerar kvads under export till format som kräver triangel (glTF, STL).
Vad är skillnaden mellan MappingMode.CONTROL_POINT och MappingMode.POLYGON_VERTEX? CONTROL_POINT Försök att få ett värde per unikt vertex. POLYGON_VERTEX lagrar ett värde per polygon-vertex par, vilket gör att olika normaler på samma vertex när det tillhör flera poligoner (hårda kantar).
Behöver jag triangulera mesh innan spara till STL? No. Biblioteket hanterar triangulering automatiskt när det exporteras till format som kräver triangel. Du kan definiera quads och n-gons i mesh och spara till STL direkt.
Hur lägger jag till UV-koordinater? Användning mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) För att skapa en VertexElementUV,Och sedan ringer setData([...]) Med en rad av FVector2 eller FVector3 värden - en per kontrollpunkt. data getter returnerar en kopia; tryck inte direkt på den.
Kan jag bygga flera mässa i en scen? Ja. Skapa flera noder under scene.rootNode och tilldelar en separat Mesh till varje node entity och egendom.