Jak načítat 3D modely do TypeScriptu

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.

Viz také:

 Čeština