Načítání 3D modelů

@aspose/3d poskytuje dvě metody načítání na Scene třídě: open() pro načítání ze souborové cesty a openFromBuffer() pro data v paměti. Detekce formátu je automatická na základě binárních magických čísel nebo přípony souboru, takže zřídka musíte explicitně uvádět formát zdroje.

Načítání z cesty k souboru

Předávejte řetězec s cestou k souboru do scene.open(). Knihovna detekuje formát z přípony souboru a u binárních formátů také z magických bajtů:

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() nahrazuje veškerý existující obsah scény. Pokud potřebujete načíst více souborů, vytvořte samostatné Scene instance.

Načítání OBJ s materiály

Soubory OBJ odkazují na materiály prostřednictvím doprovodného .mtl souboru. Načítání materiálů je ve výchozím nastavení povoleno (ObjLoadOptions.enableMaterials = true). Předávejte ObjLoadOptions pro řízení tohoto a dalších možností načítání:

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

Načítání z bufferu

Použijte openFromBuffer() když jsou data souboru již v paměti, například z HTTP požadavku, BLOBu v databázi nebo po rozbalení zip archivu. Tím se vyhnete zápisu na disk:

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

U binárních formátů (GLB, STL binary, 3MF) knihovna čte magické bajty z bufferu a automaticky detekuje formát, takže můžete předat undefined jako argument options:

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

Načítání z HTTP (Node.js 18+)

Načtěte vzdálený asset a načtěte jej, aniž byste se dotkli souborového systému:

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

Prohlížení načtené scény

Po načtení projděte graf scény, abyste vyjmenovali uzly a identifikovali geometrii:

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

Čtení metadat assetu

Ten assetInfo vlastnost zpřístupňuje metadata na úrovni souboru:

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

Ne všechny formáty vyplňují assetInfo. FBX a COLLADA mají bohatá metadata; OBJ a STL je obvykle nemají.

Reference k možnostem načítání specifickým pro formát

FormátTřída možnostíCesta importuKlíčové možnosti
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(není vyžadováno)N/AAutomaticky detekováno; třída možností není potřeba
STLStlLoadOptions@aspose/3d/formats/stl(v aktuální verzi nejsou konfigurovatelné možnosti)
FBXFbxLoadOptions@aspose/3d/formats/fbx(v aktuální verzi nejsou konfigurovatelné možnosti)
COLLADAColladaLoadOptions@aspose/3d/formats/collada(v aktuální verzi nejsou konfigurovatelné možnosti)
3MF(není vyžadováno)N/AAutomaticky detekováno

Běžné chyby při načítání

PříznakPříčinaOprava
Error: Cannot find module '@aspose/3d/formats/obj'moduleResolution není nastaveno na nodePřidat "moduleResolution": "node" do tsconfig.json
Prázdný seznam uzlů po načtení OBJ.mtl vedlejší soubor chybí nebo enableMaterials není nastavenoNastavit options.enableMaterials = true a zajistěte .mtl je ve stejném adresáři
Scéna se načte, ale rootNode.childNodes je prázdnáFormát používá jedinou kořenovou síť, ne podřízené uzlyPřístup scene.rootNode.entity přímo
openFromBuffer vyhazuje při binárním STLBuffer byl nesprávně oříznut (chybí koncové bajty)Použijte celý readFileSync() výstup bez ořezávání
Pole animačních klipů je po načtení FBX prázdnéSoubor FBX používá předpočítané transformace, ne klipyAnimace je zapečena po snímku; pole klipů bude prázdné

Viz také

 Čeština