Ładowanie modeli 3D

@aspose/3d udostępnia dwie metody ładowania w Scene klasie: open() dla ładowania z ścieżki pliku oraz openFromBuffer() dla danych w pamięci. Wykrywanie formatu jest automatyczne na podstawie binarnych liczb magicznych lub rozszerzenia pliku, więc rzadko musisz podawać format źródłowy jawnie.

Ładowanie ze ścieżki pliku

Przekaż ciąg ścieżki pliku do scene.open(). Biblioteka wykrywa format z rozszerzenia pliku i, w przypadku formatów binarnych, z bajtów magicznych:

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() zastępuje istniejącą zawartość sceny. Jeśli potrzebujesz załadować wiele plików, utwórz oddzielne Scene instancje.

Ładowanie OBJ z materiałami

Pliki OBJ odwołują się do materiałów poprzez plik towarzyszący .mtl plik. Ładowanie materiałów jest włączone domyślnie (ObjLoadOptions.enableMaterials = true). Przekaż ObjLoadOptions aby kontrolować to i inne opcje ładowania:

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

Ładowanie z bufora

Użyj openFromBuffer() gdy dane pliku są już w pamięci, na przykład po pobraniu HTTP, z BLOB-a bazy danych lub po rozpakowaniu archiwum zip. To unika zapisu na dysk:

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

Dla formatów binarnych (GLB, STL binary, 3MF) biblioteka odczytuje bajty magiczne z bufora, aby automatycznie wykryć format, więc możesz przekazać undefined jako argument opcji:

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

Ładowanie z HTTP (Node.js 18+)

Pobierz zdalny zasób i załaduj go bez użycia systemu plików:

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

Inspekcja załadowanej sceny

Po załadowaniu przejdź po grafie sceny, aby wyliczyć węzły i zidentyfikować geometrie:

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

Odczytywanie metadanych zasobu

Ten assetInfo właściwość udostępnia metadane na poziomie pliku:

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

Nie wszystkie formaty wypełniają assetInfo. FBX i COLLADA mają bogate metadane; OBJ i STL zazwyczaj ich nie mają.

Odwołanie do opcji ładowania specyficznych dla formatu

FormatKlasa opcjiŚcieżka importuKluczowe opcje
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(brak wymagań)N/AWykryto automatycznie; nie wymagana klasa opcji
STLStlLoadOptions@aspose/3d/formats/stl(brak konfigurowalnych opcji w bieżącej wersji)
FBXFbxLoadOptions@aspose/3d/formats/fbx(brak konfigurowalnych opcji w bieżącej wersji)
COLLADAColladaLoadOptions@aspose/3d/formats/collada(brak konfigurowalnych opcji w bieżącej wersji)
3MF(brak wymagań)N/AWykryto automatycznie

Typowe błędy ładowania

ObjawPrzyczynaNaprawa
Error: Cannot find module '@aspose/3d/formats/obj'moduleResolution nie ustawiono na nodeDodaj "moduleResolution": "node" do tsconfig.json
Pusta lista węzłów po załadowaniu OBJ.mtl brak sidecar lub enableMaterials nie ustawionoUstaw options.enableMaterials = true i zapewnij .mtl znajduje się w tym samym katalogu
Scena ładuje się, ale rootNode.childNodes jest pustaFormat używa pojedynczej siatki głównej, a nie węzłów potomnychDostęp scene.rootNode.entity bezpośrednio
openFromBuffer rzuca wyjątek przy binarnym STLBufor został niepoprawnie przycięty (brakujące bajty końcowe)Użyj pełnego readFileSync() wyjścia bez przycinania
Tablica klipów animacji jest pusta po załadowaniu FBXPlik FBX używa wypieczonych transformacji, nie klipówAnimacja jest wypiekana klatka po klatce; tablica klipów będzie pusta

Zobacz także

 Polski