TypeScript में 3D मॉडल कैसे लोड करें
@aspose/3d पैकेज TypeScript और Node.js अनुप्रयोगों को 3D सीन फ़ाइलें खोलने के लिए एक सरल API प्रदान करता है। Scene मूल ऑब्जेक्ट है: फ़ाइल पथ और वैकल्पिक फ़ॉर्मेट‑विशिष्ट लोड विकल्पों के साथ scene.open() को कॉल करें, फिर जियोमेट्री, मैटेरियल और ट्रांसफ़ॉर्म तक पहुँचने के लिए scene.rootNode को ट्रैवर्स करें।
चरण-दर-चरण गाइड
चरण 1: npm के माध्यम से @aspose/3d स्थापित करें
अपने प्रोजेक्ट में पैकेज जोड़ें। कोई नेटिव बाइनरी या प्लेटफ़ॉर्म‑विशिष्ट बिल्ड टूल्स आवश्यक नहीं हैं; केवल Node.js 18 या बाद का संस्करण।
npm install @aspose/3dTypeScript प्रोजेक्ट्स के लिए, टाइप डिफिनिशन पैकेज के साथ बंडल किए जाते हैं:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}चरण 2: सीन आयात करें और फ़ॉर्मेट-विशिष्ट विकल्प
प्रत्येक फ़ॉर्मेट अपने स्वयं के लोडर क्लास और विकल्प ऑब्जेक्ट को एक सब‑पाथ के तहत उजागर करता है। केवल वही आयात करें जिसकी आपको आवश्यकता है:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';अन्य फ़ॉर्मैट्स के लिए पैटर्न समान है:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';चरण 3: scene.open() का उपयोग करके 3D फ़ाइल खोलें
एक Scene इंस्टेंस बनाएं, फिर फ़ाइल पथ और एक वैकल्पिक लोड‑ऑप्शन ऑब्जेक्ट के साथ scene.open() को कॉल करें। कॉल सिंक्रोनस है।
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');मेमोरी में पहले से मौजूद Buffer से लोड करने के लिए (सर्वरलेस या स्ट्रीमिंग संदर्भों में उपयोगी):
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: सीन नोड्स पर इटररेट करें
दृश्य ग्राफ़ एक पेड़ है जिसका मूल scene.rootNode है। प्रत्येक Node में चाइल्ड नोड्स हो सकते हैं और एक वैकल्पिक entity (जैसे मेष, कैमरा, लाइट, आदि) हो सकता है।
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: controlPoints के माध्यम से मेष वर्टेक्स डेटा तक पहुँचें
जब किसी नोड की एंटिटी Mesh होती है, तो आप controlPoints एरे से कच्चे कंट्रोल पॉइंट्स (वर्टिसेज) पढ़ सकते हैं। प्रत्येक प्रविष्टि एक Vector4 है जिसमें x, y, z और w घटक होते हैं।
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: सामग्री लोड करने के लिए ObjLoadOptions को कॉन्फ़िगर करें
ObjLoadOptions उन गुणों को उजागर करता है जो यह नियंत्रित करते हैं कि साथ में आने वाली .mtl सामग्री फ़ाइलें और टेक्सचर कैसे हल किए जाते हैं।
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}`);
}
}सामान्य समस्याएँ और समाधान
त्रुटि: मॉड्यूल ‘@aspose/3d/formats/obj’ नहीं मिला
फ़ॉर्मेट सब‑पाथ्स को Node.js 12.7+ पैकेज एक्सपोर्ट्स की आवश्यकता होती है। सुनिश्चित करें कि आप Node.js 18 या उसके बाद के संस्करण पर हैं। यदि आप TypeScript का उपयोग कर रहे हैं, तो "moduleResolution": "node16" या "bundler" को tsconfig.json में सेट करें।
scene.rootNode.childNodes is empty after open()
कुछ OBJ फ़ाइलें गैर-मानक लाइन समाप्तियों का उपयोग करती हैं या उनमें अंत में नई पंक्ति नहीं होती। फ़ाइल को एक टेक्स्ट एडिटर में खोलकर यह सत्यापित करें कि वह वैध OBJ है। यह भी सुनिश्चित करें कि आपने ObjLoadOptions पास किया है और सामान्य LoadOptions नहीं: सही डिस्पैच के लिए फ़ॉर्मेट-विशिष्ट विकल्प आवश्यक हैं।
controlPoints array की लंबाई शून्य है
मेश लोड हो गया हो सकता है लेकिन इसमें कोई ज्यामिति नहीं है (उदाहरण के लिए, OBJ में एक खाली समूह)। vertices पर इटरेट करने से पहले जाँचने के लिए mesh.polygonCount का उपयोग करें।
बड़े फ़ाइलों के लिए मेमोरी उपयोग अधिक हैscene.openFromBuffer() के साथ लोड‑फ़्रॉम‑बफ़र पीक मेमोरी को कम नहीं करता: पूरी फ़ाइल को पार्स करना पड़ता है। बड़े फ़ाइलों (> 100 MB) के लिए, सुनिश्चित करें कि आपका Node.js प्रक्रिया पर्याप्त हीप रखती है: node --max-old-space-size=4096 yourScript.js.
Type errors: ’entity’ is of type ‘unknown’entity प्रॉपर्टी का टाइप व्यापक है। इसे any में कास्ट करें या किसी विशिष्ट क्लास (Mesh, Camera, आदि) में कास्ट करें, यह इस पर निर्भर करता है कि आप अपने सीन में क्या अपेक्षा करते हैं।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
scene.open() के साथ कौन से फ़ॉर्मेट लोड किए जा सकते हैं?
OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX, और COLLADA (.dae) सभी आयात के लिए समर्थित हैं। प्रत्येक फ़ॉर्मेट के लिए संबंधित *LoadOptions क्लास पास करें।
क्या मैं विकल्प निर्दिष्ट किए बिना फ़ाइल लोड कर सकता हूँ?
हाँ। scene.open('model.glb') उन फ़ॉर्मैट्स के लिए विकल्पों के बिना काम करता है जिनके लिए विशेष कॉन्फ़िगरेशन की आवश्यकता नहीं होती। OBJ के लिए विकल्प पास करना अनुशंसित है क्योंकि सामग्री समाधान enableMaterials पर निर्भर करता है।
क्या लोडिंग असिंक्रोनस रूप से चलती है?
नहीं। scene.open() और scene.openFromBuffer() सिंक्रोनस हैं। यदि आपको इवेंट लूप को उत्तरदायी रखना है तो उन्हें एक वर्कर थ्रेड या setImmediate में लपेटें।
क्या OBJ निर्यात समर्थित है?
हाँ। OBJ निर्यात scene.save('output.obj') के माध्यम से समर्थित है। .mtl सामग्री फ़ाइल स्वचालित रूप से .obj फ़ाइल के साथ लिखी जाती है।
OBJ लोड करते समय .mtl फ़ाइल कहाँ अपेक्षित है?
डिफ़ॉल्ट रूप से, पार्सर OBJ के भीतर संदर्भित .mtl फ़ाइल को (mtllib निर्देश) के अनुसार OBJ फ़ाइल की निर्देशिका के सापेक्ष खोजता है। सुनिश्चित करें कि दोनों फ़ाइलें एक ही फ़ोल्डर में हों।