Hogyan töltsünk be 3D modelleket TypeScript-ben

Hogyan töltsünk be 3D modelleket TypeScript-ben

A @aspose/3d A csomag a TypeScript és Node.js alkalmazások számára egyszerű API-t biztosít 3D jelenetfájlok megnyitásához. Scene a gyökérobjektum: hívd scene.open() egy fájlúttal és opcionális formátum-specifikus betöltési beállításokkal, majd járd be scene.rootNode a geometria, anyagok és transzformációk eléréséhez.

Lépésről-lépésre útmutató

1. lépés: Telepítsd az @aspose/3d csomagot npm‑en keresztül

Add hozzá a csomagot a projektedhez. Nem szükséges natív bináris vagy platform‑specifikus build eszköz; csak Node.js 18 vagy újabb verzió szükséges.

npm install @aspose/3d

TypeScript projektekhez a típusdefiníciók a csomaggal együtt kerülnek szállításra:

##tsconfig.json: minimum required settings
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true
  }
}

2. lépés: Importáld a Scene‑t és a formátumspecifikus beállításokat

Minden formátum saját betöltő osztályt és beállítási objektumot biztosít egy alútvonalon. Importáld csak azt, amire szükséged van:

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

Más formátumok esetén a minta azonos:

import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';

3. lépés: Nyisd meg a 3D fájlt a scene.open() segítségével

Hozz létre egy Scene példányt, majd hívd scene.open() a fájlúttal és egy opcionális betöltési opciókat tartalmazó objektummal. A hívás szinkron.

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

A betöltéshez egy Buffer már a memóriában lévő (hasznos szerver nélküli vagy streaming környezetekben):

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

4. lépés: Iterálj a jelenet csomópontjai felett

A jelenet gráf egy fa, amelynek gyökere scene.rootNode. Minden Node tartalmazhat gyermekcsomópontokat és egy opcionális entity (háló, kamera, fény, stb.).

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

5. lépés: Hozzáférés a háló csúcspont adatainak a controlPoints‑on keresztül

Amikor egy csomópont entitása egy Mesh,olvasd ki a nyers vezérlőpontokat (csúcsokat) a controlPoints tömb. Minden bejegyzés egy Vector4 val x, y, z, és w összetevők.

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)}`);
        }
    }
}

6. lépés: ObjLoadOptions konfigurálása anyagbetöltéshez

ObjLoadOptions kitetti a tulajdonságokat, amelyek szabályozzák, hogyan a kísérő .mtl anyagfájlok és textúrák kerülnek feloldásra.

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}`);
    }
}

Gyakori problémák és megoldások

Hiba: Nem található a ‘@aspose/3d/formats/obj’ modul A formátum alútvonalai Node.js 12.7+ csomagexportokat igényelnek. Győződjön meg róla, hogy Node.js 18 vagy újabb verziót használ. TypeScript használata esetén állítsa be "moduleResolution": "node16" vagy "bundler" ban tsconfig.json.

scene.rootNode.childNodes üres az open() után Egyes OBJ fájlok nem szabványos sorvégeket használnak, vagy hiányzik a záró újsor. Ellenőrizze, hogy a fájl érvényes OBJ, ha megnyitja egy szövegszerkesztőben. Emellett erősítse meg, hogy átadta a ObjLoadOptions és nem egy általános LoadOptions: a formátum-specifikus beállítások szükségesek a helyes diszpécserhez.

a controlPoints tömb hossza nulla Lehet, hogy a háló betöltődött, de nem tartalmaz geometriát (pl. egy üres csoport az OBJ-ben). Használja a mesh.polygonCount ellenőrzéshez, mielőtt a csúcsokon iterálna.

A memóriahasználat magas nagy fájlok esetén Betöltés-puffert használva a scene.openFromBuffer() nem csökkenti a csúcs memóriaigényt: a teljes fájlt fel kell dolgozni. Nagy fájlok (> 100 MB) esetén biztosítsa, hogy a Node.js folyamata elegendő halmot kapjon: node --max-old-space-size=4096 yourScript.js.

Típushibák: az ’entity’ típusa ‘unknown’ A entity A tulajdonság szélesen van tipizálva. Cast to any vagy egy konkrét osztályra (Mesh, Camera, stb.) attól függően, hogy mit vársz a jelenetedben.

Gyakran Ismételt Kérdések (GYIK)

Milyen formátumok tölthetők be a scene.open() segítségével? Az OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX és a COLLADA (.dae) mind támogatottak importálásra. Add meg a megfelelő *LoadOptions osztályt minden formátumhoz.

Betölthetek egy fájlt opciók megadása nélkül? Igen. scene.open('model.glb') opciók nélkül működik azoknál a formátumoknál, amelyekhez nincs szükség speciális konfigurációra. Az opciók megadása ajánlott az OBJ esetén, mivel az anyagfelbontás attól függ, hogy enableMaterials.

A betöltés aszinkron módon fut? Nem. scene.open() és scene.openFromBuffer() szinkronok. Csomagold őket egy munkaszálba vagy setImmediate ha azt szeretnéd, hogy az eseményciklus reagálékép legyen.

Támogatott az OBJ export? Igen. Az OBJ export támogatott a scene.save('output.obj'). A .mtl anyagfájl automatikusan a mellett kerül létrehozásra. .obj fájl.

Hol várható a .mtl fájl az OBJ betöltésekor? Alapértelmezés szerint a parser a .mtl a OBJ-n belül hivatkozott fájl (mtllib utasítás) a OBJ fájl könyvtárához viszonyítva. Győződj meg róla, hogy mindkét fájl ugyanabban a mappában van.

Lásd még

 Magyar