Зареждане на 3D модели
@aspose/3d предоставя два метода за зареждане в Scene клас: open() за зареждане от път към файл и openFromBuffer() за данни в паметта. Откриването на формата е автоматично въз основа на бинарни магически числа или разширението на файла, така че рядко е необходимо да посочвате формата на източника изрично.
Зареждане от път към файл
Подайте низа с пътя към файла на scene.open(). Библиотеката открива формата от разширението на файла и, за бинарни формати, от магическите байтове:
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() заменя всяко съществуващо съдържание на сцената. Ако трябва да заредите няколко файла, създайте отделни Scene екземпляри.
Зареждане на OBJ с материали
OBJ файловете препращат материали чрез sidecar файл. Зареждането на материали е .mtl активирано по подразбиране ). Преминете (ObjLoadOptions.enableMaterials = trueза да контролирате това и други опции при зареждане: ObjLoadOptions Използвайте:
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}`);
}Зареждане от буфер
когато данните на файла вече са в паметта, например от HTTP заявка, BLOB в база данни или извличане от zip архив. Това избягва записването на диск: openFromBuffer() За бинарни формати (GLB, STL binary, 3MF) библиотеката чете магическите байтове от буфера, за да открие формата автоматично, така че можете да предадете:
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`);For binary formats (GLB, STL binary, 3MF), the library reads the magic bytes from the buffer to detect the format automatically, so you can pass undefined като аргумент 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
Зареждане от HTTP (Node.js 18+)
Изтеглете отдалечен ресурс и го заредете без да докосвате файловата система:
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`);Преглед на заредената сцена
След зареждане, обходете графа на сцената, за да изброите възлите и идентифицирате геометрията:
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);Четене на метаданни на ресурса
Този assetInfo свойството разкрива метаданни на ниво файл:
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}`);
}Не всички формати попълват assetInfo. FBX и COLLADA имат богати метаданни; OBJ и STL обикновено нямат.
Справочник за специфични за формата опции за зареждане
| Формат | Клас Options | Път за импортиране | Ключови опции |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (не е необходимо) | N/A | Автоматично открито; не е необходим клас за опции |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (няма конфигурируеми опции в текущата версия) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (няма конфигурируеми опции в текущата версия) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (няма конфигурируеми опции в текущата версия) |
| 3MF | (не е необходимо) | N/A | Автоматично открито |
Чести грешки при зареждане
| Симптом | Причина | Поправка |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution не е зададено на node | Добави "moduleResolution": "node" към tsconfig.json |
| Празен списък с възли след зареждане на OBJ | .mtl страничният файл липсва или enableMaterials не е зададено | Задайте options.enableMaterials = true и уверете се .mtl се намира в същата директория |
Сцената се зарежда, но rootNode.childNodes е празна | Форматът използва една коренова мрежа, а не дъщерни възли | Достъп scene.rootNode.entity директно |
openFromBuffer изхвърля с бинарен STL | Буферът беше нарязан неправилно (липсват последващи байтове) | Използвайте пълния readFileSync() изход без нарязване |
| Масивът с анимационни клипове е празен след зареждане на FBX | FBX файлът използва запечени трансформации, а не клипове | Анимацията се запича за кадър; масивът с клипове ще бъде празен |
Вижте също
- Записване на 3D модели: опции за експортиране и
saveToBuffer - Граф на сцената: обхождане и модифициране на йерархията на възлите
- Преглед на API: всички класове и енумации
- Поддръжка на формати: пълен матричен достъп за четене/запис