Î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
| Format | Clasa Opțiuni | Cale de import | Opțiuni cheie |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (nu este necesar) | N/A | Detectat automat; nu este necesară nicio clasă de opțiuni |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (nu există opțiuni configurabile în versiunea curentă) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (nu există opțiuni configurabile în versiunea curentă) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (nu există opțiuni configurabile în versiunea curentă) |
| 3MF | (nu este necesar) | N/A | Detectat automat |
Erori comune de încărcare
| Simptom | Cauză | Remediere |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution nu este setat la node | Adaugă "moduleResolution": "node" la tsconfig.json |
| Listă de noduri goală după încărcarea OBJ | .mtl sidecar lipsă sau enableMaterials nu este setat | Setează 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 copil | Acces scene.rootNode.entity direct |
openFromBuffer aruncă cu STL binar | Bufferul 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 FBX | Fișierul FBX folosește transformări predefinite, nu clipuri | Animația este predefinită pe cadru; matricea de clipuri va fi goală |
Vezi și
- Salvarea modelelor 3D: opțiuni de export și
saveToBuffer - Graf de scenă: parcurgerea și modificarea ierarhiei nodurilor
- Prezentare generală a API-ului: toate clasele și enumerările
- Suport pentru formate: matrice completă de citire/scriere