Wie man 3D-Modelle in TypeScript lädt
Die @aspose/3d Das Paket bietet TypeScript und Node.js Anwendungen eine einfache API zum Öffnen von 3D-Szenendateien. Scene ist das Root-Objekt: Call scene.open() mit einem Dateipfad und optionalen formatspezifischen Ladeoptionen, dann durchlaufen scene.rootNode um auf Geometrie, Materialien und Transformationen zuzugreifen.
Schritt für Schritte
Schritt 1: Installieren von @aspose/3d über npm
Das Paket wird in Ihr Projekt aufgenommen. Keine nativen Binäre oder plattformspezifische Build-Tools sind erforderlich; nur Node.js 18 oder neuer.
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Für TypeScript-Projekte sind Typdefinitionen mit dem Paket gebündelt:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Schritt 2: Import von Szenen- und Formatspezifischen Optionen
Jedes Format zeigt seine eigene Loader-Klasse und Optionen Objekt unter einem Unterweg. Importieren Sie nur das, was Sie brauchen:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Für andere Formate ist das Muster identisch:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Schritt 3: Öffnen Sie eine 3D-Datei mit der Scene.open ((()
Erstellen einer Scene In diesem Fall ist die scene.open() Die Aufforderung ist synchron.
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');Die Übertragung von einem Buffer bereits im Speicher (nützlich in Serverlosen oder Streaming-Kontexten):
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());Schritt 4: Iteration über Szenenknoten
Die Szene Graph ist ein Baum, der an scene.rootNode.Jeder von uns . Node kann Kinderknoten und einen optionalen entity (Mesch, Kamera, Licht usw.).
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);Schritt 5: Zugriff auf die Daten über den Netzvorstand mit Hilfe von ControlPoints
Wenn die Entität eines Knoten eine ist, wird der Kern für den einzelnen Knot verwendet. Mesh, können Sie die Rohsteuerungspunkte (Wertstellen) aus dem controlPoints Jeder Eintrag ist ein Array. Vector4 mit: x, y, z,und . w Komponenten.
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)}`);
}
}
}Schritt 6: Konfigurieren von ObjLoadOptions für das Materialladen
ObjLoadOptions Die Veröffentlichung der Ergebnisse des Projekts wird von den .mtl Die Materialdateien und -texturen werden gelöst.
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}`);
}
}Häufige Probleme und Lösungen
Fehler: Modul “@aspose/3d/formats/obj” nicht gefunden Die Format-Unterwege erfordern Node.js 12.7+ Paket Exporte. Stellen Sie sicher, dass Sie auf Node .js 18 oder höher sind. Wenn Sie TypeScript verwenden, setzen Sie die "moduleResolution": "node16" oder "bundler" in der tsconfig.json.
scene.rootNode.childNodes ist nach dem Öffnen leer ((() Einige OBJ-Dateien verwenden nicht standardmäßige Zeilenende oder fehlt eine nachfolgende Neulinie. Überprüfen Sie, ob die Datei ein gültiges OB J ist, indem Sie sie in einem Texteditor öffnen. Bestätigen Sie auch, dass Sie bestanden haben ObjLoadOptions und nicht generisch. LoadOptions: die Format-spezifischen Optionen sind für den korrekten Versand erforderlich.
ControlPoints-Array hat eine Länge von Null. Das Netz ist zwar geladen, enthält aber keine Geometrie (z. B. eine leere Gruppe im OBJ). mesh.polygonCount Vor der Iteration von Wurzeln zu überprüfen.
Speicherverbrauch ist hoch für große Dateien mit einem Ausgangs- und Aufladungspuffer von: scene.openFromBuffer() reduziert den Speicher-Punkt nicht: Die gesamte Datei muss analysiert werden. Für große Daten (> 100 MB) stellen Sie sicher, dass Ihr Node.js Prozess über ausreichend Heap verfügt: node --max-old-space-size=4096 yourScript.js.
Typfehler: “Entität” ist des Typs “unbekannt” Die entity Die Eigentumsrechte sind in der Regel breit eingeteilt. any oder einer bestimmten Klasse (Mesh, Camera, etc.) je nachdem, was Sie in Ihrer Szene erwarten.
Häufig gestellte Fragen (FAQ)
Welche Formate können mit scene.open geladen werden? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX und COLLADA (.dae) werden alle für den Import unterstützt. *LoadOptions Klasse für jedes Format.
Kann ich eine Datei laden, ohne Optionen anzugeben? - Ja, das ist gut. scene.open('model.glb') Die Übergabe von Optionen wird für OBJ empfohlen, da die Materialresolution abhängig ist von der Auflösung des Bildes. enableMaterials.
Läuft das Laden asynchron? - Nein, ich bin nicht. scene.open() und . scene.openFromBuffer() Sie werden in einen Arbeiterfaden oder eine Schraube verpackt. setImmediate Wenn Sie eine Ereignisschleife reaktionsfähig halten müssen.
Wird der Export von OBJ unterstützt? Ja. Der Export von OBJ wird über die scene.save('output.obj').Die . .mtl Die Datenbank wird automatisch neben der .obj Die Akte.
Wo ist die .mtl-Datei beim Laden von OBJ zu erwarten? Standardmäßig sucht der Parser nach dem .mtl Datei, auf die im OBJ verwiesen wird (mtllib Die Daten werden in der Verzeichnismappe des OBJ-Dateies angezeigt.