Kā programmatiski izveidot 3D režģi TypeScript
Aspose.3D FOSS for TypeScript ļauj izveidot 3D ģeometriju pilnīgi kodā, neielādējot nevienu failu. Jūs definējat virsotnes pozīcijas kā kontroles punktus, norādāt daudzstūru sejas pēc indeksa un pievienojat izvēles virsotnes elementus, piemēram, normāles, UV vai virsotnes krāsas. Rezultātu var saglabāt jebkurā rakstāma formātā: glTF, GLB, STL, FBX vai COLLADA.
Priekšnosacījumi
- Node.js 18 vai jaunāks
- TypeScript 5.0 vai jaunāks
@aspose/3dinstalēts (skatīt 1. soli)
Rokasgrāmata soli pa solim
1. solis: Instalējiet @aspose/3d
npm install @aspose/3dNav vajadzīgi vietējie papildinājumi vai sistēmas bibliotēkas. Pakotnē ir iekļautas TypeScript tipa definīcijas.
Minimums tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}2. solis: Izveidojiet ainu un mezglu
Scene ir augstākā līmeņa konteineris. Visa ģeometrija jāpiestiprina Node ainas koka iekšienē:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) izveido nosauktu mezglu un pieslēdz to kā pašreizējā mezgla bērnu. Atgrieztais Node objekts ir vieta, kur pievienosiet mesh 7. solī.
3. solis: Izveidot režģa objektu
Mesh satur virsotņu pozīcijas un daudzstūru definīcijas. Izveidojiet vienu ar izvēles nosaukumu:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');Tīkls sākas tukšs: nav virsotņu un nav seju. Jūs tos pievienojat nākamajos soļos.
Solis 4: Pievienot kontroles punktus (virsotnes)
Kontroles punkti ir virsotnes pozīcijas lokālajā telpā. Ievietojiet Vector4 vērtības mesh.controlPoints. Ceturtais komponents (w) ir 1 pozīcijām:
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
Jūs atsaucaties uz šīm pozīcijām, izmantojot to nulles bāzes indeksu, definējot daudzstūra sejas.
5. solis: Izveidot daudzstūra sejas
createPolygon() definē seju, uzskaitot virsotnes indeksus secībā. Trīs indeksi veido trīsstūri:
mesh.createPolygon(0, 1, 2);Jūs varat arī definēt kvadrātus (četras indeksus) vai patvaļīgus daudzstūrus formātiem, kas tos atbalsta. glTF gadījumā bibliotēka automātiski trīsstūruveidos kvadrātus un n‑daudzstūrus eksportēšanas laikā.
6. solis: Pievienot virsotnes normāles
Normālie vektori uzlabo renderēšanas kvalitāti. Izmantojiet mesh.createElement(), lai izveidotu VertexElementNormal, savāciet normālos vektorus masīvā, pēc tam izsauciet setData(), lai tos saglabātu. data piekļuves metode (getter) atgriež aizsargājošu kopiju — pievienošana tai nav ietekmes. Izmantojiet FVector3 (vienkāršā precizitātes peldošais punkts) normālo datu glabāšanai, nevis 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 nozīmē vienu normālu uz virsotnes. ReferenceMode.DIRECT nozīmē, ka datu masīvs tiek indeksēts tieši pēc daudzstūra virsotnes indeksa.
Solis 7: Pievienot režģi un saglabāt kā glTF
Piešķiriet režģi mezglam, izmantojot node.entity, pēc tam saglabājiet ainu:
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');Lai izveidotu vienu pašpietiekamu .glb failu, iestatiet saveOpts.binaryMode = true un mainiet izvades faila paplašinājumu uz .glb.
Pilns piemērs
Tālāk ir pilns skripts, kas apvieno visus iepriekšējos soļus:
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');Izpildīt ar ts-node:
npx ts-node triangle.tsBiežāk sastopamās problēmas
| Issue | Cause | Fix |
|---|---|---|
mesh.controlPoints.length ir 0 pēc push | Tīkls nav atsaucēts nevienam mezglam | Izpildiet push pirms node.entity piešķiršanas; secībai nav nozīmes, bet pārbaudiet atsauci |
| Eksports rada tukšu ģeometriju | node.entity nav piešķirts | Pārliecinieties, ka node.entity = mesh ir pirms izsaukšanas scene.save() |
| Normālu skaita neatbilstība | Masīvs, kas nodots setData(), ir īsāks nekā controlPoints | Pievienojiet vienu FVector3 ierakstu uz katru kontroles punktu, lietojot MappingMode.CONTROL_POINT |
| glTF skatītājs rāda melnu tīklu | Normāles norāda uz iekšu | Apgrieziet vējuma kārtību createPolygon (piemēram, 0, 2, 1) vai invertējiet normālu vektorus |
| TypeScript: īpašība ’normals.data’ nav atrasta | Nekorekta importēšanas ceļš | Importējiet VertexElementNormal no @aspose/3d/entities, nevis no @aspose/3d saknes |
Biežāk uzdotie jautājumi
Vai varu izveidot kvadrātus nevis trīsstūrus?
Jā. Nododiet četrus indeksus createPolygon(0, 1, 2, 3). Bibliotēka kvadrātus pārveido par trīsstūriem eksportējot uz formātiem, kas pieprasa trīsstūrus (glTF, STL).
Kāda ir atšķirība starp MappingMode.CONTROL_POINT un MappingMode.POLYGON_VERTEX?
CONTROL_POINT saglabā vienu vērtību katram unikālam virsotnei. POLYGON_VERTEX saglabā vienu vērtību katram daudzstūra‑virsotnes pārim, kas ļauj dažādus normālus tajā pašā virsotnē, ja tā pieder pie vairākiem daudzstūriem (cietas malas).
Vai man jātrīskārto tīkls pirms saglabāšanas STL?
Nē. Bibliotēka automātiski veic trīskārtošanu, eksportējot uz formātiem, kas pieprasa trīsstūrus. Jūs varat definēt kvadrātus un n‑gonus tīklā un saglabāt STL tieši.
Kā pievienot UV koordinātas?
Izmantojiet mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT), lai izveidotu VertexElementUV, pēc tam izsauciet setData([...]) ar masīvu, kas satur FVector2 vai FVector3 vērtības — pa vienai katram kontroles punktam. data getter atgriež kopiju; nepush to tieši.
Vai es varu izveidot vairākus meshus vienā ainas?
Jā. Izveidojiet vairākus mezglus zem scene.rootNode un piešķiriet atsevišķu Mesh katra mezgla entity īpašībai.