Jak načítat 3D modely do TypeScriptu
Úřad pro bezpečnost a ochranu zdraví @aspose/3d balíček poskytuje aplikacím TypeScript a Node.js jednoduché API pro otevření 3D souborů scén. Scene je kořenový objekt: call scene.open() s dráhou souboru a volitelnými možnostmi načítání specifickými pro formát, poté se přepluje scene.rootNode k přístupu k geometrii, materiálům a transformacím.
Krok za krokem
Krok 1: Nainstalovat @aspose/3d prostřednictvím npm
Žádné nativní bináře nebo platformově specifické nástroje pro vytváření nejsou vyžadovány; pouze Node.js 18 nebo novější.
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Pro projekty TypeScript jsou definice typů v balení:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Krok 2: Import scény a specifických možností formátu
Každý formát vystavuje svůj vlastní loaderový třídu a možnosti objekt pod sub-cesty. Import pouze to, co potřebujete:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Pro ostatní formáty je vzor identický:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Krok 3: Otevřete 3D soubor pomocí scény.open()
Vytvořit Scene Příklad, pak zavolejte. scene.open() Sbližování se provádí synchronně.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.open('model.obj', options);
console.log('Scene loaded successfully');Nabití z Buffer již v paměti (užitečné v kontextech bez serverů nebo streamování):
import * as fs from 'fs';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const buffer = fs.readFileSync('model.obj');
const scene = new Scene();
scene.openFromBuffer(buffer, new ObjLoadOptions());Krok 4: Iterovat přes uzly scény
Scénový graf je strom zakořeněný v scene.rootNode.Každý . Node může obsahovat dětské uzly a volitelné entity (mříž, fotoaparát, světlo atd.).
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
function visitNode(node: any, depth: number = 0): void {
const indent = ' '.repeat(depth);
console.log(`${indent}Node: ${node.name}`);
if (node.entity) {
console.log(`${indent} Entity type: ${node.entity.constructor.name}`);
}
for (const child of node.childNodes) {
visitNode(child, depth + 1);
}
}
visitNode(scene.rootNode);Krok 5: Přístup k datům o mřížových vrcholu pomocí kontrolních bodů
Když je entita uzlu a Mesh, můžete číst přírodní ovládací body (vředy) z controlPoints Každý vstup je… Vector4 s: x, y, z,a) w komponenty.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
for (const node of scene.rootNode.childNodes) {
if (!node.entity) continue;
const entity = node.entity;
// Check if the entity is a Mesh by duck-typing controlPoints
if ('controlPoints' in entity) {
const mesh = entity as any;
console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices`);
// Print first three vertices
for (let i = 0; i < Math.min(3, mesh.controlPoints.length); i++) {
const v = mesh.controlPoints[i];
console.log(` v[${i}]: x=${v.x.toFixed(4)}, y=${v.y.toFixed(4)}, z=${v.z.toFixed(4)}`);
}
}
}Krok 6: Nastavit ObjLoadOptions pro nakládání materiálu
ObjLoadOptions Exponuje vlastnosti, které ovládají doprovodné funkce. .mtl materiální soubory a textury jsou vyřešeny.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const options = new ObjLoadOptions();
options.enableMaterials = true; // parse .mtl file if present
const scene = new Scene();
scene.open('model.obj', options);
// Inspect materials attached to nodes
for (const node of scene.rootNode.childNodes) {
if (node.material) {
console.log(`Material on "${node.name}": ${node.material.constructor.name}`);
}
}Obvyklé problémy a řešení
Chybu: Nenašel modul ‘@aspose/3d/formats/obj’ Podcesty formátu vyžadují export balíčků Node.js 12.7+. Ujistěte se, že jste na Node .js 18 nebo novější. Pokud používáte TypeScript, nastavte "moduleResolution": "node16" nebo: "bundler" v . tsconfig.json.
scene.rootNode.childPo otevření jsou uzly prázdné ((() Některé soubory OBJ používají nestandardní konce řádků nebo postrádají nový příčinný řad. Ověřte, že je soubor platný OB J otevřením v textovém editoru. Také potvrďte, zda jste prošli testem. ObjLoadOptions a není to generické. LoadOptions: pro správné odeslání jsou vyžadovány specifické možnosti formátu.
ControlPoints array má délku nula Ošivka může být nabitá, ale neobsahuje žádnou geometrii (např. prázdná skupina v OBJ). mesh.polygonCount před iterováním vrcholů.
Využití paměti je vysoké pro velké soubory . S výstupem od nárazníku s: scene.openFromBuffer() nesnižuje maximální paměť: musí být analyzován celý soubor. Pro velké soubory (> 100 MB) se ujistěte, že proces Node.js má dostatečný heap: node --max-old-space-size=4096 yourScript.js.
Chyby typu: “entita” je typu “neznámá” Úřad pro bezpečnost a ochranu zdraví entity V tomto případě je to jen jedna z možností. any nebo do určité třídy (Mesh, Camera, atd.) v závislosti na tom, co očekáváte ve své scéně.
Časté otázky (FAQ)
Které formáty lze načíst s scénou.open? Obj, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX a COLLADA (.dae) jsou všechny podporovány pro import. Projděte odpovídající kód. *LoadOptions třída pro každý formát.
Můžu si načíst soubor bez uvedení možností? - Ano, jsem. scene.open('model.glb') Pro OBJ se doporučuje možnost procházení, protože rozlišení materiálu závisí na formátu. enableMaterials.
Je nakládka asynchronní? - Ne, ne. - Cože?. scene.open() a) scene.openFromBuffer() Jsou synchronní. Obalte je do pracovního vlákna nebo setImmediate Pokud potřebujete udržet záběrovou smyčku.
Podporuje se vývoz OBJ? Ano. Vývoz OBJ je podporován prostřednictvím: scene.save('output.obj').- To je ono . .mtl materiální soubor je napsán automaticky vedle .obj - Soubor.
Kde se očekává soubor .mtl při načítání OBJ? Předvoleně, parser hledá .mtl soubor, na který se odkazuje v OBJ (mtllib Důkaz (directive) ve vztahu k adresáři souboru OBJ. Ujistěte se, že oba soubory jsou v téže složce.