Jak programově vytvořit 3D síť v TypeScriptu

Jak programově vytvořit 3D síť v TypeScriptu

Aspose.3D FOSS pro TypeScript umožňuje vytvořit 3D geometrii zcela v kódu bez načítání jakéhokoli souboru. Vy definujete pozice vrcholu jako kontrolní body, určujete polygonové tváře podle indexu a připojíte volitelné prvky vrcholů, jako jsou normály, UV nebo barvy vrcholek. Výsledek může být uložen do libovolného zapsatelného formátu: glTF, GLB, STL, FBX nebo COLLADA .

Předpoklady

  • Node.js 18 or later
  • TypScript 5.0 nebo novější
  • @aspose/3d nainstalováno (viz krok 1)

Krok za krokem

Krok 1: Nainstalovat @aspose/3d

asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.

Nevyžaduje se žádné nativní doplňky ani systémové knihovny. Paket obsahuje definice typů TypeScript.

Minimální hodnota: tsconfig.json:

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

Krok 2: Vytvořte scénu a uzel

A. Vypravit . Scene Všechna geometrie musí být připojená k Node uvnitř stromu scén:

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

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

createChildNode(name) vytvoří jmenovaný uzel a připojí ho jako dítě současného uzlu. Vrácený Node Objekt je místo, kde budete připojit síť v kroku 7.


Krok 3: Vytvořte objekt sítě

Mesh Vytvořte jeden s volitelným názvem:

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

const mesh = new Mesh('triangle');

Mřížka začíná prázdná: žádné vrcholy a tváře. Přidáte je v dalších krocích.


Krok 4: Přidání kontrolních bodů (křivek)

Kontrolní body jsou pozice vrcholu v místním prostoru. Vector4 hodnoty do mesh.controlPoints.Čtvrtá složka (w) je 1 pro pozice:

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

Tyto pozice odkazujete na jejich index založený na nule při definování polygonových tváří.


Krok 5: Vytvořte polygonové tváře

createPolygon() Tři indexy tvoří trojúhelník:

mesh.createPolygon(0, 1, 2);

Můžete také definovat čtyřkolky (čtyři indexy) nebo libovolné polygony pro formáty, které je podporují. Pro glTF knižnice automaticky triangulace čtverkolek a n-gons při vývozu.


Krok 6: Přidání normálních vertexů

Normální zlepšuje kvalitu vykreslování. mesh.createElement() vytvořit VertexElementNormal, shromáždit normální vektory do řady, pak volání setData() aby je uskladnila. data getter vrací obrannou kopii tlačení na ni nemá žádný účinek. Použijte FVector3 (jednopřesný plávací systém) pro běžné údaje, ne 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 datová řady jsou indexovány přímo indexem vrcholu polygonu.


Krok 7: Připojte síť a ukládat na glTF

Přidělit síť na uzel prostřednictvím node.entity, pak to schovej .:

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

Vytvořit jedinou samostatnou, nezávislou a bezvýhradní firmu. .glb soubor místo, nastavení saveOpts.binaryMode = true a změnit rozšíření výstupního souboru na: .glb.

Kompletní příklad

Následuje úplný scénář, který kombinuje všechny výše 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');

Běžte s ním. ts-node:

npx ts-node triangle.ts

Obvyklé problémy

Výše:Příčina:Opravy
mesh.controlPoints.length je 0 po tlaku.Sítě, na které se odkazuje žádný uzelStisk před přidělením node.entity; pořadí je jedno, ale ověřte odkaz.
Export vytváří prázdnou geometrii.node.entity nepřidělenéZajištění: node.entity = mesh před voláním . scene.save()
Neodpověď normálního počtu.Matéria přenesena na: setData() kratší než controlPointsPřidej jeden. FVector3 údaje na kontrolní bod při použití MappingMode.CONTROL_POINT
GlitF zobrazuje černou síť.Normální ukazují dovnitř.Vrátit řád zvlnění v createPolygon (např., 0, 2, 1) nebo vynechat normální vektory.
TypScript: nemovitost ’normal.data’ nenašla seŠpatná cesta importuDovoz VertexElementNormal od: @aspose/3d/entities, ne z @aspose/3d kořen

Časté otázky

Můžu vytvořit čtyřkolky místo trojúhelníků? Ano, předáš čtyři indexy. createPolygon(0, 1, 2, 3).Knihovna triangulatuje čtyřkolky při exportu do formátů, které vyžadují trojúhelníky (glTF, STL).

Jaký je rozdíl mezi MappingMode.CONTROL_POINT a) MappingMode.POLYGON_VERTEX? CONTROL_POINT ukládá jednu hodnotu na jednotlivé vrcholy. POLYGON_VERTEX ukládá jednu hodnotu na pár polygonů a vrcholů, což umožňuje různé normály ve stejném vrcholu, pokud patří k více polykontům (tvrdé okraje).

Musím si potriangulat síť, než ji ušetřím na STL? Ne. Knihovna automaticky zpracovává triangulaci při exportu do formátů, které vyžadují trojúhelníky. Můžete definovat čtyřkolky a n-gony v síti a přímo uložit na STL.

Jak přidám UV souřadnice? Použití: mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) vytvořit VertexElementUV, tak zavolej . setData([...]) s řadou: FVector2 nebo: FVector3 Hodnoty jedna na kontrolní bod. data getter vrací kopii; nepustíte přímo k ní.

Můžu vytvořit více oken v jedné scéně? Ano, vytvořit více uzlů pod scene.rootNode a přidělit samostatný Mesh na každý uzel. entity majetek.

Viz také:

 Čeština