Įkeliami 3D modeliai
@aspose/3d pateikia du įkėlimo metodus Scene klasėje: open() failo kelio įkėlimui ir openFromBuffer() atminties duomenų įkėlimui. Formato aptikimas yra automatinis, remiantis dvejetainiais magiškais skaičiais arba failo plėtiniu, todėl retai reikia nurodyti šaltinio formatą aiškiai.
Įkėlimas iš failo kelio
Perduokite failo kelio eilutę į scene.open(). Biblioteka aptinka formatą pagal failo plėtinį ir, dvejetainiams formatams, pagal magiškus baitus:
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() pakeičia bet kokį esamą scenos turinį. Jei reikia įkelti kelis failus, sukurkite atskirus Scene instancijas.
OBJ įkėlimas su medžiagomis
OBJ failai nurodo medžiagas per šoninio .mtl failą. Medžiagų įkėlimas yra įjungta pagal numatymą (ObjLoadOptions.enableMaterials = true). Pereiti ObjLoadOptions norint valdyti tai ir kitas įkėlimo laiko parinktis:
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}`);
}Įkėlimas iš buferio
Naudoti openFromBuffer() kai failo duomenys jau yra atmintyje, pavyzdžiui, iš HTTP užklausos, duomenų bazės BLOB arba zip archyvo išskleidimo. Tai išvengia rašymo į 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`);Dėl dvejetainių formatų (GLB, STL binary, 3MF) biblioteka skaito magiškus baitus iš buferio, kad automatiškai aptiktų formatą, todėl galite perduoti undefined kaip parinkčių argumentą:
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
Įkėlimas iš HTTP (Node.js 18+)
Atsisiųskite nuotolinį ištekį ir įkelkite jį nepaliesdami failų sistemos:
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`);Įkelto scenos peržiūra
Po įkėlimo, eikite per scenos grafą, kad išvardintumėte mazgus ir identifikuotumėte geometriją:
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);Išteklių metaduomenų skaitymas
Ši assetInfo savybė atskleidžia failo lygio metaduomenis:
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 visi formatai užpildo assetInfo. FBX ir COLLADA turi turtingą metaduomenų rinkinį; OBJ ir STL paprastai jų neturi.
Formato specifinių įkėlimo parinkčių nuoroda
| Formatas | Parinkčių klasė | Importo kelias | Pagrindinės parinktys |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (nėra reikalinga) | N/A | Automatiškai aptikta; parinkčių klasė nereikalinga |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (šioje versijoje nėra konfigūruojamų parinkčių) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (šioje versijoje nėra konfigūruojamų parinkčių) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (šioje versijoje nėra konfigūruojamų parinkčių) |
| 3MF | (nėra reikalinga) | N/A | Automatiškai aptikta |
Bendros įkėlimo klaidos
| Simptomas | Priežastis | Pataisa |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution nenustatyta į node | Pridėti "moduleResolution": "node" į tsconfig.json |
| Tuščas mazgų sąrašas po OBJ įkėlimo | .mtl sidecar trūksta arba enableMaterials nenustatyta | Nustatyti options.enableMaterials = true ir įsitikinkite .mtl yra tame pačiame kataloge |
Scena įkelta, bet rootNode.childNodes yra tuščia | Formatas naudoja vieną šaknies mesh, o ne vaikų mazgus | Prieiga scene.rootNode.entity tiesiogiai |
openFromBuffer išmeta klaidą su binary STL | Buffer buvo supjaustytas neteisingai (trūksta baigiamų baitų) | Naudokite visą readFileSync() išvestį be pjaustymo |
| Animacijos klipų masyvas yra tuščias po FBX įkėlimo | FBX failas naudoja iš anksto apskaičiuotus transformavimus, o ne klipus | Animacija yra iš anksto apskaičiuota kiekvienam kadrui; klipų masyvas bus tuščias |
Žr. taip pat
- 3D modelių išsaugojimas: eksporto parinktys ir
saveToBuffer - Scenos grafas: medžio hierarchijos naršymas ir keitimas
- API apžvalga: visos klasės ir enumeracijos
- Formato palaikymas: pilna skaitymo/rašymo matrica