Ł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
| Format | Klasa opcji | Ścieżka importu | Kluczowe opcje |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (brak wymagań) | N/A | Wykryto automatycznie; nie wymagana klasa opcji |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (brak konfigurowalnych opcji w bieżącej wersji) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (brak konfigurowalnych opcji w bieżącej wersji) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (brak konfigurowalnych opcji w bieżącej wersji) |
| 3MF | (brak wymagań) | N/A | Wykryto automatycznie |
Typowe błędy ładowania
| Objaw | Przyczyna | Naprawa |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution nie ustawiono na node | Dodaj "moduleResolution": "node" do tsconfig.json |
| Pusta lista węzłów po załadowaniu OBJ | .mtl brak sidecar lub enableMaterials nie ustawiono | Ustaw options.enableMaterials = true i zapewnij .mtl znajduje się w tym samym katalogu |
Scena ładuje się, ale rootNode.childNodes jest pusta | Format używa pojedynczej siatki głównej, a nie węzłów potomnych | Dostęp scene.rootNode.entity bezpośrednio |
openFromBuffer rzuca wyjątek przy binarnym STL | Bufor 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 FBX | Plik FBX używa wypieczonych transformacji, nie klipów | Animacja jest wypiekana klatka po klatce; tablica klipów będzie pusta |
Zobacz także
- Zapisywanie modeli 3D: opcje eksportu i
saveToBuffer - Graf sceny: przeglądanie i modyfikowanie hierarchii węzłów
- Przegląd API: wszystkie klasy i wyliczenia
- Obsługa formatów: pełna macierz odczytu/zapisu