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: Scene और फ़ॉर्मेट-विशिष्ट विकल्प इम्पोर्ट करें
प्रत्येक फ़ॉर्मेट अपने लोडर क्लास और विकल्प ऑब्जेक्ट को एक सब‑पाथ के तहत उजागर करता है। केवल वही इम्पोर्ट करें जिसकी आपको आवश्यकता है:
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() फ़ाइल पथ और वैकल्पिक load-options ऑब्जेक्ट के साथ। कॉल सिंक्रोनस है।.
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, आप रॉ कंट्रोल पॉइंट्स (vertices) को पढ़ सकते हैं 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 open() के बाद खाली है कुछ OBJ फ़ाइलें गैर-मानक लाइन समाप्तियों का उपयोग करती हैं या उनके अंत में नई पंक्ति नहीं होती। फ़ाइल को एक टेक्स्ट एडिटर में खोलकर यह सत्यापित करें कि वह वैध OBJ है। यह भी पुष्टि करें कि आपने पास किया ObjLoadOptions और कोई सामान्य नहीं LoadOptions: सही डिस्पैच के लिए फ़ॉर्मेट-विशिष्ट विकल्प आवश्यक हैं।.
controlPoints एरे की लंबाई शून्य है मेश लोड हो सकता है लेकिन उसमें कोई ज्योमेट्री नहीं है (उदाहरण के लिए, OBJ में एक खाली समूह)। उपयोग करें mesh.polygonCount वर्टिसेज़ पर इटररेट करने से पहले जाँचने के लिए।.
बड़ी फ़ाइलों के लिए मेमोरी उपयोग अधिक है Load-from-buffer के साथ scene.openFromBuffer() पीक मेमोरी को कम नहीं करता: पूरी फ़ाइल को पार्स करना आवश्यक है। बड़ी फ़ाइलों (> 100 MB) के लिए, सुनिश्चित करें कि आपका Node.js प्रोसेस पर्याप्त हीप रखता है: node --max-old-space-size=4096 yourScript.js.
टाइप त्रुटियाँ: ’entity’ का प्रकार ‘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() सिंक्रोनस हैं। उन्हें एक worker thread में लपेटें या setImmediate यदि आपको इवेंट लूप को प्रतिक्रियाशील रखना है।.
क्या OBJ निर्यात समर्थित है? हाँ। OBJ निर्यात via scene.save('output.obj'). यह .mtl material file स्वचालित रूप से साथ में लिखा जाता है .obj फ़ाइल।.
OBJ लोड करते समय .mtl फ़ाइल कहाँ अपेक्षित है? डिफ़ॉल्ट रूप से, पार्सर खोजता है .mtl फ़ाइल जो OBJ के भीतर संदर्भित है (mtllib निर्देश) OBJ फ़ाइल की निर्देशिका के सापेक्ष। सुनिश्चित करें कि दोनों फ़ाइलें एक ही फ़ोल्डर में हैं।.