Kā ielādēt 3D modeļus TypeScript
Šis @aspose/3d pakotne 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.
Solī pa solim ceļvedis
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; nepieciešams tikai Node.js 18 vai jaunāks.
npm install @aspose/3dTypeScript projektiem tipa definīcijas ir iekļautas pakotnē:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}2. solis: Importējiet Scene un formātam specifiskās opcijas
Katrs formāts atklāj savu ielādētāja klasi un opciju objektu apakšceļā. Importējiet tikai to, kas jums vajadzīgs:
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 instanci, pēc tam izsauciet scene.open() ar 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 Buffer jau atmiņā (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ējiet pār ainas mezgliem
Skatu grafiks ir koks, kura sakne ir scene.rootNode.mezgls 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ļūstiet tīkla virsotņu datiem caur controlPoints
Kad mezgla vienība ir Mesh, jūs varat nolasīt neapstrādātos kontroles punktus (virsotnes) no the controlPoints masīvs. Katrs ieraksts ir Vector4 ar x, y, z, un w komponentes.
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ējiet ObjLoadOptions materiālu ielādei
ObjLoadOptions atklāj īpašības, lai kontrolētu, kā tiek .mtl materiālu faili un tekstūras tiek atrisinātas.
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}`);
}
}Biežāk sastopamās problēmas un risinājumi
Kļūda: Nevar atrast moduli ‘@aspose/3d/formats/obj’ Formāta apakšceļiem ir nepieciešami Node.js 12.7+ pakotņu eksporti. Pārliecinieties, ka izmantojat Node.js 18 vai jaunāku versiju. 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 beigas 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 un nevis vispārīgu LoadOptions: formāta specifiskās opcijas ir nepieciešamas pareizai nosūtīšanai.
controlPoints masīvam ir nulles garums Tīkls var būt ielādēts, bet nesatur ģeometriju (piem., tukšu grupu OBJ). Izmantojiet mesh.polygonCount lai pārbaudītu pirms virsotņu iterācijas.
Atmiņas patēriņš ir liels lieliem failiem Ielādēt 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 pietiekami liels kaudzes (heap) apjoms: node --max-old-space-size=4096 yourScript.js.
Tipa kļūdas: ’entity’ ir tipa ‘unknown’ Tas entity īpašība ir tipizēta plaši. Pārveido uz any vai uz konkrētu klasi (Mesh, Camera, utt.) atkarībā no tā, ko sagaidāt savā ainas.
Biežāk uzdotie jautājumi (BUJ)
Kādus formātus var ielādēt ar scene.open()? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX un COLLADA (.dae) visi tiek atbalstīti importam. Nododiet 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, kam nav nepieciešama īpaša konfigurācija. Opciju nodrošināšana tiek ieteikta OBJ gadījumā, jo materiālu izšķirtspēja ir atkarīga no enableMaterials.
Vai ielāde notiek asinhroni? Nē. scene.open() un scene.openFromBuffer() ir sinhroni. Ievietojiet tos darbinieka pavedienā vai setImmediate ja jums jāuztur notikumu cikls atsaucīgs.
Vai OBJ eksportēšana tiek atbalstīta? Jā. OBJ eksportēšana tiek atbalstīta caur scene.save('output.obj'). The .mtl materiālu fails tiek automātiski rakstīts blakus the .obj fails.
Kur sagaidāms .mtl fails, ielādējot OBJ? Pēc noklusējuma parsētājs meklē .mtl fails, uz ko atsaucas OBJ iekšpusē (mtllib norādījums) attiecībā uz OBJ faila direktoriju. Pārliecinieties, ka abi faili atrodas tajā pašā mapē.