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/3dasennettu (katso Vaihe 1)
Vaiheittainen opas
Vaihe 1: Asenna @aspose/3d
npm install @aspose/3dEi 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.tsYleiset ongelmat
| Ongelma | Syy | Korjaus |
|---|---|---|
mesh.controlPoints.length on 0 työntämisen jälkeen | Verkkkoa ei viitata missään solmussa | Työnnä ennen kuin määrität node.entity; järjestyksellä ei ole väliä, mutta tarkista viite |
| Vienti tuottaa tyhjän geometrian | node.entity ei ole määritetty | Varmista node.entity = mesh ennen kuin kutsut scene.save() |
| Normaalien lukumäärä ei täsmää | setData():lle annettu taulukko on lyhyempi kuin controlPoints | Lisää yksi FVector3-merkintä per ohjauspiste kun käytetään MappingMode.CONTROL_POINT |
| glTF-katseluohjelma näyttää mustan verkon | Normaalit osoittavat sisäänpäin | Käännä kierrejärjestys createPolygon:ssä (esim. 0, 2, 1) tai käännä normaalivektorit |
| TypeScript: ominaisuutta ’normals.data’ ei löydy | Väärä tuontipolku | Tuo 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.