Sådan indlæses 3D-modeller i TypeScript
@aspose/3d-pakken giver TypeScript- og Node.js-applikationer et enkelt API til at åbne 3D-scene-filer. Scene er rodobjektet: kald scene.open() med en filsti og valgfrie format‑specifikke indlæsningsindstillinger, og traversér derefter scene.rootNode for at få adgang til geometri, materialer og transformationer.
Trin-for-trin guide
Trin 1: Installer @aspose/3d via npm
Tilføj pakken til dit projekt. Ingen native binære filer eller platformspecifikke buildværktøjer er påkrævet; kun Node.js 18 eller senere.
npm install @aspose/3dFor TypeScript‑projekter er type‑definitioner bundtet med pakken:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Trin 2: Importer scene og format‑specifikke indstillinger
Hvert format eksponerer sin egen loader‑klasse og options‑objekt under en understi. Importér kun det, du har brug for:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';For andre formater er mønsteret identisk:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Trin 3: Åbn en 3D‑fil ved hjælp af scene.open()
Opret en Scene-instans, og kald derefter scene.open() med filstien og et valgfrit load-options-objekt. Kaldet er synkront.
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');For at indlæse fra en Buffer, der allerede er i hukommelsen (nyttigt i serverløse eller streaming‑kontekster):
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());Trin 4: Iterer over scenenoder
Scenegrafen er et træ med roden i scene.rootNode. Hver Node kan indeholde undernoder og en valgfri entity (mesh, kamera, lys osv.).
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);Trin 5: Få adgang til mesh‑vertexdata via controlPoints
Når en nodes enhed er en Mesh, kan du læse de rå kontrolpunkter (vertices) fra controlPoints-arrayet. Hvert element er en Vector4 med x, y, z og w komponenter.
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)}`);
}
}
}Trin 6: Konfigurer ObjLoadOptions til indlæsning af materialer
ObjLoadOptions eksponerer egenskaber til at kontrollere, hvordan tilhørende .mtl materialefiler og teksturer løses.
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}`);
}
}Almindelige problemer og rettelser
Fejl: Kan ikke finde modulet ‘@aspose/3d/formats/obj’
Format-understierne kræver Node.js 12.7+ pakkeeksporter. Sørg for, at du bruger Node.js 18 eller nyere. Hvis du bruger TypeScript, skal du indstille "moduleResolution": "node16" eller "bundler" i tsconfig.json.
scene.rootNode.childNodes er tom efter open()
Nogle OBJ-filer bruger ikke‑standard linjeafslutninger eller mangler en afsluttende ny linje. Bekræft, at filen er en gyldig OBJ ved at åbne den i en teksteditor. Bekræft også, at du har videregivet ObjLoadOptions og ikke en generisk LoadOptions: de format‑specifikke indstillinger er påkrævet for korrekt dispatch.
controlPoints array har nul længde
Mesh’en kan være indlæst, men indeholder ingen geometri (f.eks. en tom gruppe i OBJ). Brug mesh.polygonCount til at tjekke, før du itererer vertices.
Memory usage is high for large files
Load-from-buffer med scene.openFromBuffer() reducerer ikke spidshukommelsen: hele filen skal parses. For store filer (> 100 MB) skal du sikre, at din Node.js‑proces har tilstrækkelig heap: node --max-old-space-size=4096 yourScript.js.
Typefejl: ’entity’ er af typen ‘unknown’
Egenskaben entity er bredt typet. Cast til any eller til en specifik klasse (Mesh, Camera osv.) afhængigt af hvad du forventer i din scene.
Ofte stillede spørgsmål (FAQ)
Hvilke formater kan indlæses med scene.open()?
OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX og COLLADA (.dae) understøttes alle til import. Angiv den tilsvarende *LoadOptions‑klasse for hvert format.
Kan jeg indlæse en fil uden at angive indstillinger?
Ja. scene.open('model.glb') fungerer uden indstillinger for formater, der ikke kræver særlig konfiguration. Det anbefales at angive indstillinger for OBJ, fordi materialopløsning afhænger af enableMaterials.
Kører indlæsning asynkront?
Nej. scene.open() og scene.openFromBuffer() er synkrone. Pak dem ind i en worker‑tråd eller setImmediate, hvis du har brug for at holde en event‑loop responsiv.
Er OBJ-eksport understøttet?
Ja. OBJ-eksport understøttes via scene.save('output.obj'). .mtl-materialfilen skrives automatisk ved siden af .obj-filen.
Hvor forventes .mtl-filen at være, når man indlæser OBJ?
Som standard søger parseren efter .mtl-filen, der refereres til inde i OBJ (mtllib-direktivet) relativt til OBJ-filens mappe. Sørg for, at begge filer er i samme mappe.