TypeScript में 3D सीन को glTF/GLB में निर्यात कैसे करें
Aspose.3D FOSS glTF 2.0 को आयात और निर्यात दोनों स्वरूप के रूप में समर्थन करता है। वही Scene ऑब्जेक्ट OBJ, FBX, STL, या अन्य स्रोत फ़ाइल से भरा जा सकता है और फिर .gltf (JSON + बाहरी बाइनरी) या .glb (एकल बाइनरी कंटेनर) में लिखा जा सकता है, GltfSaveOptions पर एक फ़्लैग सेट करके।
चरण-दर-चरण गाइड
चरण 1: @aspose/3d इंस्टॉल करें
npm install @aspose/3dपुष्टि करें कि Node.js 18 या बाद का संस्करण सक्रिय है:
node --version # must be >= 16.0.0चरण 2: Scene, GltfSaveOptions, और GltfFormat आयात करें
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat वह फ़ॉर्मेट डिस्क्रिप्टर है जो scene.save() को पास किया जाता है। GltfSaveOptions सभी निर्यात कॉन्फ़िगरेशन को ले जाता है।
यदि आप भी एक स्रोत फ़ाइल (जैसे, OBJ) लोड कर रहे हैं, तो मिलते‑जुलते लोड विकल्प आयात करें:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';चरण 3: दृश्य बनाएं या लोड करें
विकल्प A: मौजूदा फ़ाइल से लोड करें (OBJ → GLB रूपांतरण):
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());विकल्प B: न्यूनतम दृश्य को प्रोग्रामेटिक रूप से बनाएं:
import { Scene, Node, Mesh } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const childNode = new Node('cube');
scene.rootNode.addChildNode(childNode);
// Attach geometry to childNode as needed
चरण 4: GltfSaveOptions कॉन्फ़िगर करें
GltfSaveOptions आउटपुट फ़ॉर्मेट और एन्कोडिंग विवरण को नियंत्रित करता है।
const saveOpts = new GltfSaveOptions();
// Set to true for a single binary .glb file
// Set to false (default) for JSON .gltf + separate .bin
saveOpts.binaryMode = true;आप सेट कर सकते हैं अतिरिक्त विकल्प:
| प्रॉपर्टी | प्रकार | डिफ़ॉल्ट | प्रभाव |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | इंजन संगतता के लिए UV वर्टिकल अक्ष को उलटें |
चरण 5: scene.save() का उपयोग करके सहेजें
आउटपुट पथ, GltfFormat डिस्क्रिप्टर, और कॉन्फ़िगर किए गए विकल्प पास करें:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true; // produce .glb
scene.save('output.glb', GltfFormat.getInstance(), saveOpts);
console.log('Converted to GLB successfully');इसके बजाय एक JSON .gltf फ़ाइल बनाने के लिए:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');चरण 6: आउटपुट फ़ाइल को सत्यापित करें
जाँचें कि आउटपुट फ़ाइल मौजूद है और उसका आकार शून्य नहीं है:
import * as fs from 'fs';
const outputPath = 'output.glb';
const stats = fs.statSync(outputPath);
console.log(`Output file size: ${stats.size} bytes`);
if (stats.size === 0) {
throw new Error('Export produced an empty file: check scene content');
}राउंड-ट्रिप सत्यापन के लिए, GLB को पुनः लोड करें और नोड काउंट की जांच करें:
import { Scene } from '@aspose/3d';
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
const verify = new Scene();
verify.open('output.glb', new GltfLoadOptions());
let nodeCount = 0;
function countNodes(node: any): void {
nodeCount++;
for (const child of node.childNodes) countNodes(child);
}
countNodes(verify.rootNode);
console.log(`Round-trip verification: ${nodeCount} node(s) in output`);सामान्य समस्याएँ और समाधान
OBJ सामग्री फ़ाइल निर्यात के बाद नहीं मिली
OBJ में scene.save('output.obj') के माध्यम से सहेजते समय, .mtl सामग्री फ़ाइल स्वचालित रूप से .obj फ़ाइल के साथ लिखी जाती है। सुनिश्चित करें कि आउटपुट डायरेक्टरी लिखने योग्य है और दोनों फ़ाइलें साथ रखी गई हों।
आउटपुट .glb अपेक्षा से छोटा है / मेष गायब हैं
यदि लोड किया गया सीन उन नोड्स को शामिल करता है जिनमें कोई एंटिटी नहीं है (उदाहरण के लिए, OBJ से खाली समूह), तो GLB में उन नोड्स की ज्योमेट्री नहीं होगी। सहेजने से पहले mesh.controlPoints.length > 0 का उपयोग करके पुष्टि करें कि आपकी इनपुट फ़ाइल में वास्तविक पॉलीगॉन डेटा है।
मॉड्यूल ‘@aspose/3d/formats/gltf’ नहीं मिला
सुनिश्चित करें कि आप Node.js 18+ पर हैं और @aspose/3d आपके एंट्री पॉइंट के समान node_modules में स्थापित है।npm ls @aspose/3d चलाएँ ताकि संस्करण 24.12.0 या बाद का हो, यह पुष्टि हो सके।
GltfFormat.getInstance() undefined लौटाता है
यह मुख्य @aspose/3d पैकेज और कैश किए गए पुराने संस्करण के बीच संस्करण असंगति को दर्शाता है। node_modules और package-lock.json को हटाएँ, फिर npm install को फिर से चलाएँ।
आउटपुट GLB में टेक्सचर गायब हैं
सुनिश्चित करें कि binaryMode = true को एक स्व-समाहित GLB उत्पन्न करने के लिए सेट किया गया है। glTF JSON आउटपुट के लिए, टेक्सचर इमेज फ़ाइलें आउटपुट फ़ाइल के साथ मौजूद होनी चाहिए क्योंकि उन्हें सापेक्ष पथ द्वारा संदर्भित किया जाता है।
टाइप त्रुटि: प्रकार ‘GltfSaveOptions’ का तर्क असाइन नहीं किया जा सकता
सुनिश्चित करें कि Scene और GltfSaveOptions दोनों को एक ही स्थापित पैकेज इंस्टेंस से आयात किया गया है। मिश्रित इंस्टॉल (ग्लोबल + लोकल) इंटरफ़ेस में असंगतियों का कारण बन सकते हैं।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
glTF और GLB में क्या अंतर है?
glTF 2.0 JSON (.gltf) दृश्य ग्राफ़ को एक मानव‑पठनीय JSON फ़ाइल के रूप में संग्रहीत करता है जिसमें अलग‑अलग .bin बफ़र और छवि फ़ाइलें होती हैं। GLB (.glb) सब कुछ एक एकल बाइनरी कंटेनर में पैकेज करता है। binaryMode = true को GLB के लिए, false को JSON glTF के लिए सेट करें।
क्या मैं पूरी तरह कोड में निर्मित (कोई स्रोत फ़ाइल नहीं) दृश्य को निर्यात कर सकता हूँ?
हाँ। एक Scene बनाएं, Node वस्तुएँ जोड़ें, Mesh या अन्य इकाइयों को संलग्न करें, फिर scene.save() को कॉल करें। दृश्य को लोड की गई फ़ाइल से उत्पन्न होने की आवश्यकता नहीं है।
क्या glTF निर्यात लॉसलेस है?
ज्यामिति और ट्रांसफ़ॉर्म के लिए, हाँ। सामग्री को जहाँ संभव हो glTF PBR सामग्री गुणों में मैप किया जाता है। स्वामित्व वाले FBX सामग्री एक्सटेंशन पूरी तरह से राउंड‑ट्रिप नहीं हो सकते।
क्या मैं STL या 3MF के बजाय निर्यात कर सकता हूँ?
हाँ। पैटर्न समान है; संबंधित फ़ॉर्मेट के *SaveOptions और *Format.getInstance() को इम्पोर्ट करें:
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);क्या scene.save() असिंक्रोनस रूप से चलता है?
नहीं। scene.save() सिंक्रोनस है। यदि आपको बड़े निर्यात के दौरान इवेंट लूप को ब्लॉक करने से बचना है तो इसे एक वर्कर थ्रेड में रैप करें।
Node.js के कौन से संस्करण समर्थित हैं?
Node.js 18, 20, और 22+. Node.js 16 और उससे पहले के संस्करण समर्थित नहीं हैं।