Kā ielādēt 3D modeļus TypeScript

Kā ielādēt 3D modeļus TypeScript

Paketē @aspose/3d nodrošina TypeScript un Node.js lietojumprogrammām vienkāršu API 3D skatu failu atvēršanai. Scene ir saknes objekts: izsauciet scene.open() ar faila ceļu un izvēles formāta specifiskajām ielādes opcijām, pēc tam pārlūkojiet scene.rootNode, lai piekļūtu ģeometrijai, materiāliem un transformācijām.

Rokasgrāmata soli pa solim

1. solis: Instalējiet @aspose/3d, izmantojot npm

Pievienojiet pakotni savam projektam. Nav vajadzīgi vietējie binārie faili vai platformas specifiski būvēšanas rīki; tikai Node.js 18 vai jaunāks.

npm install @aspose/3d

TypeScript projektiem tipa definīcijas ir iekļautas pakotnē:

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

2. solis: Importēt ainu un formāta specifiskās opcijas

Katrs formāts atklāj savu ielādētāja klasi un opciju objektu apakšceļā. Importējiet tikai to, kas nepieciešams:

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

Citiem formātiem paraugs ir identisks:

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

3. solis: Atveriet 3D failu, izmantojot scene.open()

Izveidojiet Scene instance, pēc tam izsauciet scene.open(), nododot faila ceļu un izvēles ielādes opciju objektu. Izsaukums ir sinhrons.

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');

Lai ielādētu no jau atmiņā esoša Buffer (noderīgi serverless vai straumēšanas kontekstos):

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());

4. solis: Iterēt pār ainas mezgliem

Ainas grafiks ir koks, kura sakne ir scene.rootNode. Katrs Node var saturēt bērna mezglus un izvēles entity (tīkls, kamera, gaisma utt.).

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

5. solis: Piekļūt režģa virsotņu datiem, izmantojot controlPoints

Kad mezgla vienība ir Mesh, jūs varat nolasīt neapstrādātos kontroles punktus (virsotnes) no controlPoints masīva. Katrs ieraksts ir Vector4 ar x, y, z un w komponentēm.

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

6. solis: Konfigurēt ObjLoadOptions materiālu ielādei

ObjLoadOptions sniedz īpašības, lai kontrolētu, kā tiek atrisinātas saistītās .mtl materiālu datnes un tekstūras.

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.material) {
        console.log(`Material on "${node.name}": ${node.material.constructor.name}`);
    }
}

Biežas problēmas un risinājumi

Kļūda: Nevar atrast moduli ‘@aspose/3d/formats/obj’ Formāta apakšceļi pieprasa Node.js 12.7+ paketes eksportus. Pārliecinieties, ka izmantojat Node.js 18 vai jaunāku. Ja izmantojat TypeScript, iestatiet "moduleResolution": "node16" vai "bundler" iekš tsconfig.json.

scene.rootNode.childNodes ir tukšs pēc open() Daži OBJ faili izmanto nestandarta rindu beigu simbolus vai trūkst beigu jaunas rindas. Pārbaudiet, vai fails ir derīgs OBJ, atverot to teksta redaktorā. Arī pārliecinieties, ka esat nodrošinājis ObjLoadOptions, nevis vispārīgu LoadOptions: formāta specifiskās opcijas ir nepieciešamas pareizai izsaukšanai.

controlPoints masīvs ir nulles garuma
Tīkls varētu būt ielādēts, bet nesatur ģeometriju (piemēram, tukšu grupu OBJ failā). Izmantojiet mesh.polygonCount, lai pārbaudītu pirms virsotņu iterācijas.

Atmiņas patēriņš ir liels lielām failiem
Ielāde no bufera ar scene.openFromBuffer() nemazina maksimālo atmiņas patēriņu: jāparsē viss fails. Lieliem failiem (> 100 MB) pārliecinieties, ka jūsu Node.js processam ir pietiekama kaudze: node --max-old-space-size=4096 yourScript.js.

Tipa kļūdas: ’entity’ ir tipa ‘unknown’ Īpašība entity ir plaši tipizēta. Pārveido uz any vai uz konkrētu klasi (Mesh, Camera utt.), atkarībā no tā, ko sagaidi savā ainas.

Biežāk uzdotie jautājumi (BUJ)

Kādi formāti var tikt ielādēti ar scene.open()?
OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX un COLLADA (.dae) visi tiek atbalstīti importam. Pārsūtiet atbilstošo *LoadOptions klasi katram formātam.

Vai varu ielādēt failu, nenorādot opcijas? Jā. scene.open('model.glb') darbojas bez opcijām formātiem, kas neprasa īpašu konfigurāciju. Ieteicams nodot opcijas OBJ, jo materiālu izšķirtspēja ir atkarīga no enableMaterials.

Vai ielāde notiek asinhroni?
Nē. scene.open() un scene.openFromBuffer() ir sinhroni. Ietiniet tos darbinieka pavedienā vai setImmediate, ja jums jāuztur notikumu cikls atsaucīgs.

Vai OBJ eksports tiek atbalstīts?
Jā. OBJ eksports tiek atbalstīts caur scene.save('output.obj'). .mtl materiāla fails tiek rakstīts automātiski blakus .obj failam.

Kur .mtl fails tiek sagaidīts, ielādējot OBJ?
Pēc noklusējuma parsētājs meklē .mtl failu, uz kuru atsaucas OBJ (mtllib norāde), attiecīgi pret OBJ faila direktoriju. Pārliecinieties, ka abi faili atrodas tajā pašā mapē.

Skatīt arī

 Latviešu