Încărcarea modelelor 3D

@aspose/3d furnizează două metode de încărcare pe Scene clasă: open() pentru încărcarea prin cale de fișier și openFromBuffer() pentru date în memorie. Detectarea formatului este automată pe baza numerelor magice binare sau a extensiei fișierului, astfel că rar trebuie să specificați explicit formatul sursei.

Încărcarea dintr-o cale de fișier

Transmiteți șirul căii fișierului către scene.open(). Biblioteca detectează formatul din extensia fișierului și, pentru formatele binare, din octeții magici:

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

const scene = new Scene();
scene.open('model.fbx');

console.log(`Root children: ${scene.rootNode.childNodes.length}`);
console.log(`Animation clips: ${scene.animationClips.length}`);

open() înlocuiește orice conținut existent al scenei. Dacă trebuie să încărcați mai multe fișiere, creați Scene instanțe.

Încărcarea OBJ cu materiale

Fișierele OBJ fac referire la materiale printr-un fișier sidecar .mtl fișier. Încărcarea materialelor este activată în mod implicit (ObjLoadOptions.enableMaterials = true). Transmite ObjLoadOptions pentru a controla aceasta și alte opțiuni de încărcare:

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

const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;       // load the .mtl sidecar
options.flipCoordinateSystem = false; // keep original Y-up orientation
options.normalizeNormal = true;       // fix degenerate normals
options.scale = 1.0;                  // unit scale multiplier

scene.open('character.obj', options);

// Inspect materials on the first node
const first = scene.rootNode.childNodes[0];
if (first) {
    console.log(`Materials on ${first.name}: ${first.materials.length}`);
}

Încărcarea dintr-un buffer

Folosește openFromBuffer() când datele fișierului sunt deja în memorie, de exemplu dintr-o preluare HTTP, un BLOB din bază de date sau o extragere dintr-un arhivă zip. Aceasta evită scrierea pe disc:

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

const buffer: Buffer = fs.readFileSync('model.obj');
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;

scene.openFromBuffer(buffer, options);
console.log(`Loaded ${scene.rootNode.childNodes.length} root nodes`);

Pentru formatele binare (GLB, STL binary, 3MF), biblioteca citește octeții magici din buffer pentru a detecta automat formatul, astfel încât poți transmite undefined ca argument de opțiuni:

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

const glbBuffer: Buffer = fs.readFileSync('model.glb');
const scene = new Scene();
scene.openFromBuffer(glbBuffer); // format auto-detected from GLB magic bytes

Încărcarea din HTTP (Node.js 18+)

Obțineți un asset de la distanță și încărcați-l fără a atinge sistemul de fișiere:

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

async function loadFromUrl(url: string): Promise<Scene> {
    const response = await fetch(url);
    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    const arrayBuffer = await response.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);

    const scene = new Scene();
    scene.openFromBuffer(buffer);
    return scene;
}

const scene = await loadFromUrl('https://example.com/model.glb');
console.log(`Loaded scene: ${scene.rootNode.childNodes.length} root nodes`);

Inspectarea scenei încărcate

După încărcare, parcurgeți graful scenei pentru a enumera nodurile și a identifica geometria:

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

const scene = new Scene();
scene.open('model.fbx');

function inspect(node: Node, depth: number = 0): void {
    const indent = '  '.repeat(depth);
    const entityType = node.entity ? node.entity.constructor.name : '(none)';
    console.log(`${indent}${node.name} [${entityType}]`);

    if (node.entity instanceof Mesh) {
        const mesh = node.entity as Mesh;
        console.log(`${indent}  vertices: ${mesh.controlPoints.length}, polygons: ${mesh.polygonCount}`);
    }

    for (const child of node.childNodes) {
        inspect(child, depth + 1);
    }
}

inspect(scene.rootNode);

Citirea metadatelor asset-ului

The assetInfo proprietate expune metadatele la nivel de fișier:

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

const scene = new Scene();
scene.open('model.fbx');

const info = scene.assetInfo;
if (info) {
    console.log(`Creator: ${info.creator}`);
    console.log(`Unit name: ${info.unitName}`);
    console.log(`Unit scale: ${info.unitScaleFactor}`);
}

Nu toate formatele populează assetInfo. FBX și COLLADA au metadate bogate; OBJ și STL de obicei nu le au.

Referință pentru opțiunile de încărcare specifice formatului

FormatClasa OpțiuniCale de importOpțiuni cheie
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(nu este necesar)N/ADetectat automat; nu este necesară nicio clasă de opțiuni
STLStlLoadOptions@aspose/3d/formats/stl(nu există opțiuni configurabile în versiunea curentă)
FBXFbxLoadOptions@aspose/3d/formats/fbx(nu există opțiuni configurabile în versiunea curentă)
COLLADAColladaLoadOptions@aspose/3d/formats/collada(nu există opțiuni configurabile în versiunea curentă)
3MF(nu este necesar)N/ADetectat automat

Erori comune de încărcare

SimptomCauzăRemediere
Error: Cannot find module '@aspose/3d/formats/obj'moduleResolution nu este setat la nodeAdaugă "moduleResolution": "node" la tsconfig.json
Listă de noduri goală după încărcarea OBJ.mtl sidecar lipsă sau enableMaterials nu este setatSetează options.enableMaterials = true și asigură-te .mtl se află în același director
Scena se încarcă, dar rootNode.childNodes este goalăFormatul folosește o singură plasă rădăcină, nu noduri copilAcces scene.rootNode.entity direct
openFromBuffer aruncă cu STL binarBufferul a fost tăiat incorect (octeți de la final lipsă)Folosește întregul readFileSync() ieșire fără tăiere
Matricea de clipuri de animație este goală după încărcarea FBXFișierul FBX folosește transformări predefinite, nu clipuriAnimația este predefinită pe cadru; matricea de clipuri va fi goală

Vezi și

 Română