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/3dnainstalová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.tsObvyklé problémy
| Výše: | Příčina: | Opravy |
|---|---|---|
mesh.controlPoints.length je 0 po tlaku. | Sítě, na které se odkazuje žádný uzel | Stisk 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ž controlPoints | Př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 importu | Dovoz 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.