Laddar 3D-modeller
@aspose/3d tillhandahåller två inläsningsmetoder på den Scene klass: open() för inläsning via filsökväg och openFromBuffer() för data i minnet. Formatdetektering sker automatiskt från binära magiska tal eller filändelse, så du behöver sällan ange källformatet explicit.
Laddning från en filsökväg
Skicka filvägssträngen till scene.open(). Biblioteket upptäcker formatet från filändelsen och, för binära format, från de magiska byten:
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() ersätter allt befintligt sceninnehåll. Om du behöver läsa in flera filer, skapa separata Scene instanser.
Laddning av OBJ med material
OBJ-filer refererar material via en sidecar .mtl fil. Materialinläsning är aktiverad som standard (ObjLoadOptions.enableMaterials = true). Skicka ObjLoadOptions för att kontrollera detta och andra inläsningsalternativ:
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}`);
}Inläsning från en buffer
Använd openFromBuffer() när fildatan redan finns i minnet, till exempel från en HTTP‑hämtning, en databas‑BLOB eller en zip‑arkivextraktion. Detta undviker att skriva till 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`);För binära format (GLB, STL binary, 3MF) läser biblioteket de magiska byten från bufferten för att automatiskt upptäcka formatet, så du kan skicka undefined som options-argumentet:
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
Laddning från HTTP (Node.js 18+)
Hämta en fjärrresurs och ladda den utan att röra filsystemet:
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`);Inspektera den inlästa scenen
Efter inläsning, gå igenom scen‑grafen för att lista noder och identifiera geometri:
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);Läsa metadata för resursen
Den assetInfo egenskapen exponerar metadata på filnivå:
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}`);
}Inte alla format fyller i assetInfo. FBX och COLLADA har rik metadata; OBJ och STL har vanligtvis inte.
Referens för format‑specifika laddningsalternativ
| Format | Alternativklass | Importväg | Nyckelalternativ |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (ingen krävs) | N/A | Automatiskt upptäckt; ingen alternativklass behövs |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (inga konfigurerbara alternativ i nuvarande version) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (inga konfigurerbara alternativ i nuvarande version) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (inga konfigurerbara alternativ i nuvarande version) |
| 3MF | (ingen krävs) | N/A | Automatiskt upptäckt |
Vanliga inläsningsfel
| Symptom | Orsak | Åtgärd |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution inte satt till node | Lägg till "moduleResolution": "node" till tsconfig.json |
| Tom nodlista efter inläsning av OBJ | .mtl sidofilen saknas eller enableMaterials inte inställd | Ange options.enableMaterials = true och säkerställ .mtl är i samma katalog |
Scenen laddas men rootNode.childNodes är tom | Formatet använder ett enda rotmesh, inte barnnoder | Åtkomst scene.rootNode.entity direkt |
openFromBuffer kastar fel med binär STL | Bufferten skars felaktigt (slutbyte saknas) | Använd hela readFileSync() utdata utan beskärning |
| Arrayen med animationsklipp är tom efter FBX-inläsning | FBX-filen använder bakade transformationer, inte klipp | Animationen bakas per bildruta; clip array blir tom |
Se även
- Spara 3D-modeller: exportalternativ och
saveToBuffer - Scengraf: traversera och modifiera nodhierarkin
- API‑översikt: alla klasser och uppräkningar
- Formatstöd: fullständig läs/skriv-matris