Kaip įkelti 3D modelius TypeScript kalba

Kaip įkelti 3D modelius TypeScript kalba

Šis @aspose/3d paketas suteikia TypeScript ir Node.js programoms paprastą API 3D scenų failų atvėrimui. Scene yra šakninis objektas: iškvieskite scene.open() su failo keliu ir neprivalomomis formatui specifinėmis įkėlimo parinktimis, tada naršykite scene.rootNode norėdami pasiekti geometriją, medžiagas ir transformacijas.

Žingsnis po žingsnio vadovas

Žingsnis 1: Įdiekite @aspose/3d per npm

Pridėkite paketą prie savo projekto. Nereikia jokių natūralių binarinių failų ar platformai specifinių kūrimo įrankių; reikalingas tik Node.js 18 arba naujesnis.

npm install @aspose/3d

TypeScript projektams tipų apibrėžimai yra įpaketuoti kartu su paketu:

##tsconfig.json: minimum required settings
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true
  }
}

Žingsnis 2: Importuokite Scene ir formatui specifines parinktis

Kiekvienas formatas atskleidžia savo įkėlimo klasę ir parinkčių objektą po subkelio. Importuokite tik tai, ką reikia:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

Kitiems formatams šablonas yra identiškas:

import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';

Žingsnis 3: Atverkite 3D failą naudodami scene.open()

Sukurkite Scene instanciją, tada iškvieskite scene.open() su failo keliu ir neprivalomu įkėlimo parinkčių objektu. Iškvietimas yra sinchroninis.

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;

scene.open('model.obj', options);
console.log('Scene loaded successfully');

Norėdami įkelti iš Buffer jau atmintyje (naudinga serverless arba srautinėse kontekstuose):

import * as fs from 'fs';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const buffer = fs.readFileSync('model.obj');
const scene = new Scene();
scene.openFromBuffer(buffer, new ObjLoadOptions());

Žingsnis 4: Iteruokite per scenos mazgus

Scenos grafas yra medis, kurio šaknis yra scene.rootNode. Kiekvienas Node gali turėti vaikų mazgus ir neprivalomą entity (tinklelį, kamerą, šviesą ir t.t.).

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());

function visitNode(node: any, depth: number = 0): void {
    const indent = '  '.repeat(depth);
    console.log(`${indent}Node: ${node.name}`);
    if (node.entity) {
        console.log(`${indent}  Entity type: ${node.entity.constructor.name}`);
    }
    for (const child of node.childNodes) {
        visitNode(child, depth + 1);
    }
}

visitNode(scene.rootNode);

Žingsnis 5: Pasiekite tinklo viršūnių duomenis per controlPoints

Kai mazgo objektas yra Mesh, galite perskaityti neapdorotus kontrolinius taškus (viršūnes) iš the controlPoints masyvas. Kiekvienas įrašas yra Vector4 su x, y, z, ir w komponentų.

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());

for (const node of scene.rootNode.childNodes) {
    if (!node.entity) continue;
    const entity = node.entity;
    // Check if the entity is a Mesh by duck-typing controlPoints
    if ('controlPoints' in entity) {
        const mesh = entity as any;
        console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices`);
        // Print first three vertices
        for (let i = 0; i < Math.min(3, mesh.controlPoints.length); i++) {
            const v = mesh.controlPoints[i];
            console.log(`  v[${i}]: x=${v.x.toFixed(4)}, y=${v.y.toFixed(4)}, z=${v.z.toFixed(4)}`);
        }
    }
}

Žingsnis 6: Konfigūruokite ObjLoadOptions medžiagų įkėlimui

ObjLoadOptions atskleidžia savybes, kurios kontroliuoja, kaip lydomi .mtl medžiagos failai ir tekstūros yra išsprendžiami.

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const options = new ObjLoadOptions();
options.enableMaterials = true;   // parse .mtl file if present

const scene = new Scene();
scene.open('model.obj', options);

// Inspect materials attached to nodes
for (const node of scene.rootNode.childNodes) {
    if (node.entity && node.entity.material) {
        console.log(`Material on "${node.name}": ${node.entity.material.constructor.name}`);
    }
}

Dažnos problemos ir sprendimai

Klaida: Nepavyksta rasti modulio ‘@aspose/3d/formats/obj’ Formato subkeliai reikalauja Node.js 12.7+ paketų eksportų. Įsitikinkite, kad naudojate Node.js 18 arba naujesnę versiją. Jei naudojate TypeScript, nustatykite "moduleResolution": "node16" arba "bundler" į tsconfig.json.

scene.rootNode.childNodes yra tuščias po open() Kai kurie OBJ failai naudoja nestandartinius eilučių pabaigos ženklus arba neturi baigiamojo naujo eilutės simbolio. Patikrinkite, ar failas yra galiojantis OBJ, atidarydami jį teksto redaktoriuje. Taip pat įsitikinkite, kad perdavėte ObjLoadOptions ir ne bendrinį LoadOptions: formatui būdingos parinktys yra būtinos teisingam paskirstymui.

controlPoints masyvas turi nulio ilgį Tinklas galėjo būti įkeltas, bet neturi geometrijos (pvz., tuščia grupė OBJ). Naudokite mesh.polygonCount patikrinti prieš iteruojant viršūnes.

Atminties naudojimas didelis dideliems failams Load-from-buffer su scene.openFromBuffer() nesumažina didžiausios atminties: visą failą reikia išanalizuoti. Dideliems failams (> 100 MB) įsitikinkite, kad jūsų Node.js procesas turi pakankamą heap: node --max-old-space-size=4096 yourScript.js.

Tipų klaidos: ’entity’ yra tipo ‘unknown’ Šis entity savybė yra plačiai tipizuota. Paversti į any arba į konkrečią klasę (Mesh, Camera, ir t.t.) priklausomai nuo to, ko tikitės savo scenoje.

Dažnai užduodami klausimai (DUK)

Kokius formatus galima įkelti naudojant scene.open()? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX ir COLLADA (.dae) visi yra palaikomi importui. Perduokite atitinkamą *LoadOptions klasę kiekvienam formatui.

Ar galiu įkelti failą nenurodydamas parinkčių? Taip. scene.open('model.glb') veikia be parinkčių formatams, kuriems nereikia specialios konfigūracijos. Parinkčių perdavimas rekomenduojamas OBJ, nes medžiagos rezoliucija priklauso nuo enableMaterials.

Ar įkėlimas vyksta asinchroniškai? Ne. scene.open() ir scene.openFromBuffer() yra sinchroniniai. Įdėkite juos į darbinę giją arba setImmediate jei reikia, kad įvykių ciklas išliktų reaguojantis.

Ar OBJ eksportas palaikomas? Taip. OBJ eksportas palaikomas per scene.save('output.obj'). Šis .mtl medžiagos failas rašomas automatiškai šalia .obj failas.

Kur tikimasi .mtl failo įkeliant OBJ? Pagal numatymą, analizatorius ieško .mtl failo, nurodyto OBJ viduje (mtllib direktyva) santykinai su OBJ failo katalogu. Įsitikinkite, kad abu failai yra tame pačiame aplanke.

Žr. taip pat

 Lietuvių