Kā programmatiski izveidot 3D režģi TypeScript

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/3d instalēts (skatīt 1. soli)

Rokasgrāmata soli pa solim

1. solis: Instalējiet @aspose/3d

npm install @aspose/3d

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

Biežāk sastopamās problēmas

IssueCauseFix
mesh.controlPoints.length ir 0 pēc pushTīkls nav atsaucēts nevienam mezglamIzpildiet push pirms node.entity piešķiršanas; secībai nav nozīmes, bet pārbaudiet atsauci
Eksports rada tukšu ģeometrijunode.entity nav piešķirtsPārliecinieties, ka node.entity = mesh ir pirms izsaukšanas scene.save()
Normālu skaita neatbilstībaMasīvs, kas nodots setData(), ir īsāks nekā controlPointsPievienojiet vienu FVector3 ierakstu uz katru kontroles punktu, lietojot MappingMode.CONTROL_POINT
glTF skatītājs rāda melnu tīkluNormāles norāda uz iekšuApgrieziet vējuma kārtību createPolygon (piemēram, 0, 2, 1) vai invertējiet normālu vektorus
TypeScript: īpašība ’normals.data’ nav atrastaNekorekta 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.

Skatīt arī

 Latviešu