Kuinka rakentaa 3D-verkko ohjelmallisesti TypeScriptissä

Kuinka rakentaa 3D-verkko ohjelmallisesti TypeScriptissä

Aspose.3D FOSS for TypeScript antaa sinun rakentaa 3D-geometrian kokonaan koodissa lataamatta mitään tiedostoa. Määrittelet kärkipisteiden sijainnit ohjauspisteinä, määrität monikulmioiden pinnat indeksin avulla ja liität valinnaisia kärki‑elementtejä, kuten normaalit, UV:t tai kärkin värit. Tulos voidaan tallentaa mihin tahansa kirjoitettavissa olevaan formaattiin: glTF, GLB, STL, FBX tai COLLADA.

Edellytykset

  • Node.js 18 tai uudempi
  • TypeScript 5.0 tai uudempi
  • @aspose/3d asennettu (katso Vaihe 1)

Vaiheittainen opas

Vaihe 1: Asenna @aspose/3d

npm install @aspose/3d

Ei vaadita natiivisia lisäosia tai järjestelmäkirjastoja. Paketti sisältää TypeScript-tyyppimäärittelyt.

Vähimmäisarvo tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "strict": true
  }
}

Vaihe 2: Luo kohtaus ja solmu

A Scene on ylimmän tason säiliö. Kaikki geometria on liitettävä Node:iin kohtauspuun sisällä:

import { Scene } from '@aspose/3d';

const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');

createChildNode(name) luo nimetty solmu ja kytkee sen nykyisen solmun lapsena. Palautettu Node-objekti on se, johon liität verkon vaiheessa 7.


Vaihe 3: Luo Mesh-objekti

Mesh sisältää kärkipisteet ja monikulmioiden määritelmät. Rakenna yksi valinnaisella nimellä:

import { Mesh } from '@aspose/3d/entities';

const mesh = new Mesh('triangle');

Verkko alkaa tyhjänä: ei kärkiä eikä pintoja. Lisäät ne seuraavissa vaiheissa.


Vaihe 4: Lisää ohjauspisteet (solmut)

Ohjauspisteet ovat kärkipisteiden sijainteja paikallisessa tilassa. Työnnä Vector4 arvot mesh.controlPoints:een. Neljäs komponentti (w) on 1 sijainneille:

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

Viittaat näihin paikkoihin niiden nollapohjaiseen indeksiin määritellessäsi polygonin tahkot.


Vaihe 5: Luo monikulmion pinnat

createPolygon() määrittelee pinnan luettelemalla kärkipisteiden indeksit järjestyksessä. Kolme indeksiä muodostaa kolmion:

mesh.createPolygon(0, 1, 2);

Voit myös määrittää nelikulmioita (neljä indeksiä) tai mielivaltaisia monikulmioita formaateille, jotka tukevat niitä. glTF:ssä kirjasto trianguloi automaattisesti nelikulmiot ja n-gonit viennin yhteydessä.


Vaihe 6: Lisää kärjen normaalit

Normaalit parantavat renderöinnin laatua. Käytä mesh.createElement() luodaksesi VertexElementNormal, kerää normaalivektorit taulukkoon ja kutsu sitten setData() tallentaaksesi ne. data-getter palauttaa suojatun kopion — sen työntäminen ei vaikuta. Käytä FVector3 (yksittäistarkkuusliukuluku) normaalidataa varten, älä 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 tarkoittaa yhtä normaalia per kärki.
ReferenceMode.DIRECT tarkoittaa, että data-taulukko indeksoidaan suoraan monikulmion kärjen indeksillä.


Vaihe 7: Liitä verkko ja tallenna glTF

Määritä verkko solmulle node.entity, sitten tallenna kohtaus:

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');

Tuottaaksesi yhden itsenäisen .glb-tiedoston sen sijaan, aseta saveOpts.binaryMode = true ja muuta tulostetiedoston tiedostopääte muotoon .glb.

Kokonainen esimerkki

Seuraava on koko skripti, joka yhdistää kaikki yllä olevat vaiheet:

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');

Suorita ts-node:lla.

npx ts-node triangle.ts

Yleiset ongelmat

OngelmaSyyKorjaus
mesh.controlPoints.length on 0 työntämisen jälkeenVerkkkoa ei viitata missään solmussaTyönnä ennen kuin määrität node.entity; järjestyksellä ei ole väliä, mutta tarkista viite
Vienti tuottaa tyhjän geometriannode.entity ei ole määritettyVarmista node.entity = mesh ennen kuin kutsut scene.save()
Normaalien lukumäärä ei täsmääsetData():lle annettu taulukko on lyhyempi kuin controlPointsLisää yksi FVector3-merkintä per ohjauspiste kun käytetään MappingMode.CONTROL_POINT
glTF-katseluohjelma näyttää mustan verkonNormaalit osoittavat sisäänpäinKäännä kierrejärjestys createPolygon:ssä (esim. 0, 2, 1) tai käännä normaalivektorit
TypeScript: ominaisuutta ’normals.data’ ei löydyVäärä tuontipolkuTuo VertexElementNormal kohteesta @aspose/3d/entities, ei @aspose/3d-juuresta

Usein kysytyt kysymykset

Voinko luoda nelikulmioita kolmioiden sijaan? Kyllä. Anna neljä indeksiä createPolygon(0, 1, 2, 3):lle. Kirjasto kolmioittaa nelikulmiot viennin aikana formaatteihin, jotka vaativat kolmioita (glTF, STL).

Mikä on ero MappingMode.CONTROL_POINT ja MappingMode.POLYGON_VERTEX välillä?
CONTROL_POINT tallentaa yhden arvon per ainutlaatuinen kärki. POLYGON_VERTEX tallentaa yhden arvon per monikulmio‑kärkipari, mikä mahdollistaa eri normaalit samassa kärjessä, kun se kuuluu useisiin monikulmioihin (kovat reunat).

Tarvitseeko verkko kolmioitua ennen tallentamista STL-muotoon?
Ei. Kirjasto hoitaa kolmioituksen automaattisesti, kun viedään formaatteihin, jotka vaativat kolmioita. Voit määrittää nelikulmioita ja n‑goneja verkossa ja tallentaa suoraan STL-muotoon.

Kuinka lisään UV-koordinaatit? Käytä mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) luodaksesi VertexElementUV, sitten kutsu setData([...]) taulukolla, joka sisältää FVector2- tai FVector3-arvoja — yksi per ohjauspiste. data-getter palauttaa kopion; älä työnnä siihen suoraan.

Voinko rakentaa useita verkkoja yhdessä kohtauksessa? Kyllä. Luo useita solmuja scene.rootNode:n alle ja määritä erillinen Mesh jokaisen solmun entity-ominaisuuteen.

Katso myös

 Suomi