Ako programovo vytvoriť 3D sieť v TypeScripte
Aspose.3D FOSS pre TypeScript vám umožňuje vytvárať 3D geometriu úplne v kóde bez načítania akéhokoľvek súboru. Definujete pozície vrcholov ako kontrolné body, špecifikujete polygonálne tváre podľa indexu a pripojíte voliteľné prvky vrcholov, ako sú normály, UV alebo farby vrcholov. Výsledok je možné uložiť do akéhokoľvek zapisovateľného formátu: glTF, GLB, STL, FBX alebo COLLADA.
Požiadavky
- Node.js 18 alebo novší
- TypeScript 5.0 alebo novší
@aspose/3dnainštalovaný (pozri Krok 1)
Sprievodca krok za krokom
Krok 1: Nainštalujte @aspose/3d
npm install @aspose/3dNie sú potrebné žiadne natívne doplnky ani systémové knižnice. Balík obsahuje definície typov TypeScript.
Minimum tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Krok 2: Vytvoriť scénu a uzol
Scene je kontajner najvyššej úrovne. Všetka geometria musí byť pripojená k Node v rámci stromu scény:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) vytvorí pomenovaný uzol a pripojí ho ako dieťa aktuálneho uzla. Vrátený objekt Node je miesto, kde v kroku 7 pripojíte mesh.
Krok 3: Vytvoriť Mesh Object
Mesh obsahuje pozície vrcholov a definície polygonov. Vytvorte jeden s voliteľným názvom:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');Mriežka začína prázdna: žiadne vrcholy a žiadne plochy. Pridáte ich v nasledujúcich krokoch.
Krok 4: Pridať kontrolné body (vrcholy)
Kontrolné body sú pozície vrcholov v lokálnom priestore. Vložte hodnoty Vector4 do mesh.controlPoints. Štvrtá zložka (w) je 1 pre pozície:
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
Pri definovaní polygonových plôch odkazujete na tieto pozície pomocou ich nulového indexu.
Krok 5: Vytvoriť polygonové plochy
createPolygon() definuje plochu výpisom indexov vrcholov v poradí. Tri indexy tvoria trojuholník:
mesh.createPolygon(0, 1, 2);Môžete tiež definovať štvoruholníky (štyri indexy) alebo ľubovoľné polygóny pre formáty, ktoré ich podporujú. Pre glTF knižnica automaticky trianguluje štvoruholníky a n-góny pri exporte.
Krok 6: Pridať normály vrcholov
Normály zlepšujú kvalitu renderovania. Použite mesh.createElement() na vytvorenie VertexElementNormal, zozbierajte normálové vektory do poľa a potom zavolajte setData() na ich uloženie. Getter data vracia obrannú kópiu — pridávanie do nej nemá žiadny účinok. Použite FVector3 (jednoprecízny float) pre normálové dáta, nie 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 znamená jeden normál na vrchol. ReferenceMode.DIRECT znamená, že dátové pole je indexované priamo podľa indexu vrcholu polygonu.
Krok 7: Pripojte sieť a uložte do glTF
Priraďte sieť k uzlu prostredníctvom node.entity, potom uložte scénu:
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');Ak chcete namiesto toho vytvoriť jeden samostatný .glb súbor, nastavte saveOpts.binaryMode = true a zmeňte príponu výstupného súboru na .glb.
Kompletný príklad
Nasleduje celý skript kombinujúci všetky vyššie uvedené kroky:
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');Spustiť s ts-node:
npx ts-node triangle.tsBežné problémy
| Problém | Príčina | Oprava |
|---|---|---|
mesh.controlPoints.length je po pushi 0 | Sieť nie je odkazovaná žiadnym uzlom | Push pred priradením node.entity; poradie nie je dôležité, ale overte odkaz |
| Export vytvára prázdnu geometriu | node.entity nie je priradené | Zabezpečte node.entity = mesh pred volaním scene.save() |
| Nesúlad počtu normál | Pole odovzdané do setData() je kratšie ako controlPoints | Pridajte jeden záznam FVector3 na riadiaci bod pri použití MappingMode.CONTROL_POINT |
| glTF prehliadač zobrazuje čiernu sieť | Normály smerujú dovnútra | Obráťte smerovanie winding v createPolygon (napr. 0, 2, 1) alebo negujte vektory normál |
| TypeScript: vlastnosť ’normals.data’ nebola nájdená | Nesprávna cesta importu | Importujte VertexElementNormal z @aspose/3d/entities, nie z koreňa @aspose/3d |
Často kladené otázky
Môžem vytvárať štvoruholníky namiesto trojuholníkov?
Áno. Odovzdajte štyri indexy do createPolygon(0, 1, 2, 3). Knižnica trianguluje štvoruholníky počas exportu do formátov, ktoré vyžadujú trojuholníky (glTF, STL).
Aký je rozdiel medzi MappingMode.CONTROL_POINT a MappingMode.POLYGON_VERTEX?CONTROL_POINT ukladá jednu hodnotu na jedinečný vrchol. POLYGON_VERTEX ukladá jednu hodnotu na pár polygon‑vrchol, čo umožňuje rôzne normály na tom istom vrchole, keď patrí do viacerých polygonov (tvrdé hrany).
Potrebujem triangulovať sieť pred uložením do STL? Nie. Knižnica automaticky vykoná trianguláciu pri exporte do formátov, ktoré vyžadujú trojuholníky. Môžete v sieti definovať štvoruholníky a n‑góny a uložiť priamo do STL.
Ako pridám UV súradnice?
Použite mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) na vytvorenie VertexElementUV, potom zavolajte setData([...]) s poľom hodnôt FVector2 alebo FVector3 — po jednej na kontrolný bod. Getter data vracia kópiu; neprehadzujte do nej priamo.
Môžem vytvoriť viacero meshov v jednej scéne?
Áno. Vytvorte viacero uzlov pod scene.rootNode a priraďte samostatný Mesh k vlastnosti entity každého uzla.