Indlæsning af 3D-modeller

@aspose/3d leverer to indlæsningsmetoder på den Scene klasse: open() til indlæsning via filsti og openFromBuffer() til data i hukommelsen. Formatgenkendelse er automatisk ud fra binære magiske tal eller filendelse, så du sjældent behøver at angive kildeformatet eksplicit.

Indlæsning fra en filsti

Send filstistrengen til scene.open(). Biblioteket opdager formatet ud fra filendelsen og, for binære formater, ud fra de magiske bytes:

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() erstatter alt eksisterende scenindhold. Hvis du har brug for at indlæse flere filer, skal du oprette separate Scene instanser.

Indlæsning af OBJ med materialer

OBJ-filer refererer materialer gennem en side‑car .mtl fil. Materialindlæsning er aktiveret som standard (ObjLoadOptions.enableMaterials = true). Send ObjLoadOptions for at kontrollere dette og andre indlæsningsindstillinger:

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}`);
}

Indlæsning fra en buffer

Brug openFromBuffer() når fildataene allerede er i hukommelsen, for eksempel fra et HTTP‑hent, en database‑BLOB eller en udtrækning fra et zip‑arkiv. Dette undgår at skrive til 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`);

For binære formater (GLB, STL binary, 3MF) læser biblioteket de magiske bytes fra bufferten for automatisk at opdage formatet, så du kan sende 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

Indlæsning fra HTTP (Node.js 18+)

Hent en fjern‑asset og indlæs den uden at røre 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`);

Inspektion af den indlæste scene

Efter indlæsning, gennemgå scenegrafen for at enumerere noder og identificere 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æsning af asset‑metadata

Den assetInfo egenskaben eksponerer metadata på filniveau:

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}`);
}

Ikke alle formater udfylder assetInfo. FBX og COLLADA har rig metadata; OBJ og STL har typisk ikke.

Reference til format‑specifikke indlæsningsindstillinger

FormatOptions-klasseImportstiNøgleindstillinger
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(ingen påkrævet)N/AAutomatisk registreret; ingen options-klasse nødvendig
STLStlLoadOptions@aspose/3d/formats/stl(ingen konfigurerbare indstillinger i den aktuelle version)
FBXFbxLoadOptions@aspose/3d/formats/fbx(ingen konfigurerbare indstillinger i den aktuelle version)
COLLADAColladaLoadOptions@aspose/3d/formats/collada(ingen konfigurerbare indstillinger i den aktuelle version)
3MF(ingen påkrævet)N/AAutomatisk registreret

Almindelige indlæsningsfejl

SymptomÅrsagLøsning
Error: Cannot find module '@aspose/3d/formats/obj'moduleResolution ikke indstillet til nodeTilføj "moduleResolution": "node" til tsconfig.json
Tom node-liste efter indlæsning af OBJ.mtl sidecar mangler eller enableMaterials ikke indstilletIndstil options.enableMaterials = true og sørg for .mtl er i samme mappe
Scene indlæses men rootNode.childNodes er tomFormatet bruger et enkelt root mesh, ikke undernoderAdgang scene.rootNode.entity direkte
openFromBuffer kaster med binær STLBufferen blev skåret forkert (efterfølgende bytes mangler)Brug den fulde readFileSync() output uden at skære
Animationsklip-arrayet er tomt efter FBX-indlæsningFBX-filen bruger bagte transformationer, ikke klipAnimationen er bagt per frame; clip-arrayet vil være tomt

Se også

 Dansk