Į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

FormatasParinkčių klasėImporto keliasPagrindinės parinktys
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(nėra reikalinga)N/AAutomatiškai aptikta; parinkčių klasė nereikalinga
STLStlLoadOptions@aspose/3d/formats/stl(šioje versijoje nėra konfigūruojamų parinkčių)
FBXFbxLoadOptions@aspose/3d/formats/fbx(šioje versijoje nėra konfigūruojamų parinkčių)
COLLADAColladaLoadOptions@aspose/3d/formats/collada(šioje versijoje nėra konfigūruojamų parinkčių)
3MF(nėra reikalinga)N/AAutomatiškai aptikta

Bendros įkėlimo klaidos

SimptomasPriežastisPataisa
Error: Cannot find module '@aspose/3d/formats/obj'moduleResolution nenustatyta į nodePridėti "moduleResolution": "node" į tsconfig.json
Tuščas mazgų sąrašas po OBJ įkėlimo.mtl sidecar trūksta arba enableMaterials nenustatytaNustatyti options.enableMaterials = true ir įsitikinkite .mtl yra tame pačiame kataloge
Scena įkelta, bet rootNode.childNodes yra tuščiaFormatas naudoja vieną šaknies mesh, o ne vaikų mazgusPrieiga scene.rootNode.entity tiesiogiai
openFromBuffer išmeta klaidą su binary STLBuffer buvo supjaustytas neteisingai (trūksta baigiamų baitų)Naudokite visą readFileSync() išvestį be pjaustymo
Animacijos klipų masyvas yra tuščias po FBX įkėlimoFBX failas naudoja iš anksto apskaičiuotus transformavimus, o ne klipusAnimacija yra iš anksto apskaičiuota kiekvienam kadrui; klipų masyvas bus tuščias

Žr. taip pat

 Lietuvių