सीन ग्राफ के साथ काम करना
सभी 3D सामग्री Aspose.3D FOSS for TypeScript के भीतर एक Scene ऑब्जेक्ट जो ट्री के रूप में व्यवस्थित है Node ऑब्जेक्ट्स। इस पदानुक्रम को समझना किसी भी 3D फ़ाइल को बनाने, लोड करने और प्रोसेस करने की नींव है।.
Installation
इस गाइड में किसी भी कोड को चलाने से पहले npm से पैकेज इंस्टॉल करें:
npm install @aspose/3dसुनिश्चित करें कि आपका tsconfig.json शामिल करता है "module": "commonjs" और "moduleResolution": "node" सही सब‑पाथ इम्पोर्ट रिज़ॉल्यूशन के लिए।.
सीन ग्राफ अवधारणाएँ
सीन ग्राफ में तीन स्तर होते हैं:
| स्तर | क्लास | भूमिका |
|---|---|---|
| सीन | Scene | शीर्ष‑स्तर कंटेनर। रखता है rootNode, animationClips, और assetInfo. |
| नोड | Node | नामित ट्री नोड। इसमें चाइल्ड नोड्स, एक एंटिटी, एक ट्रांसफ़ॉर्म, और मैटेरियल्स हो सकते हैं।. |
| एंटिटी | Mesh, Camera, Light, … | एक नोड से जुड़ी सामग्री। एक नोड अधिकतम एक इकाई रखता है।. |
मुख्य बिल्डिंग ब्लॉक्स के लिए इनहेरिटेंस चेन इस प्रकार है:
A3DObject
└─ SceneObject
├─ Node (tree structure)
└─ Entity
└─ Geometry
└─ Mesh (polygon geometry)scene.rootNode स्वचालित रूप से बनाया जाता है। आप इसे मैन्युअल रूप से नहीं बनाते; आप इसके तहत चाइल्ड नोड्स बनाते हैं।.
स्टेप 1: एक सीन बनाएं
import { Scene } from '@aspose/3d';
const scene = new Scene();
console.log(scene.rootNode.name); // '' (empty string — the root node is created with no name)
एक नया Scene एक खाली रूट नोड और कोई एनीमेशन क्लिप नहीं के साथ शुरू होता है। आप चाइल्ड नोड्स को संलग्न करके सामग्री बनाते हैं।.
चरण 2: चाइल्ड नोड्स जोड़ें
उपयोग करें createChildNode() वृक्ष को बढ़ाने के लिए। यह मेथड नया Node, इसलिए आप किसी भी स्तर से आगे के कॉल्स को चेन कर सकते हैं:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
console.log(scene.rootNode.childNodes.length); // 1 (parent)
console.log(parent.childNodes.length); // 1 (child)
नोड नाम मनमाने स्ट्रिंग्स होते हैं। नाम अनन्य होने की आवश्यकता नहीं है, लेकिन अर्थपूर्ण नामों का उपयोग करने से ट्रैवर्सल कोड को डिबग करना आसान हो जाता है।.
चरण 3: मेष बनाएं और वर्टिसेज सेट करें
Mesh प्राथमिक ज्यामिति क्लास है। वर्टेक्स पोजीशन को पुश करके जोड़ें Vector4 मानों को mesh.controlPoints, फिर कॉल करें createPolygon() वर्टेक्स इंडेक्स द्वारा फेस को परिभाषित करने के लिए:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4 } from '@aspose/3d/utilities';
const scene = new Scene();
const child = scene.rootNode.createChildNode('parent').createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3); // quad face using all four vertices
child.entity = mesh;
console.log(mesh.controlPoints.length); // 4
console.log(mesh.polygonCount); // 1
Vector4 समरूप निर्देशांक का उपयोग करता है: यह w घटक है 1 पोजीशन के लिए और 0 दिशा वेक्टरों के लिए।.
चरण 4: नोड ट्रांसफ़ॉर्म सेट करें
प्रत्येक नोड के पास एक transform प्रॉपर्टी है जिसमें translation, rotation, और scaling. सेट करें translation नोड को उसके पैरेंट के सापेक्ष स्थानांतरित करने के लिए:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4, Vector3 } from '@aspose/3d/utilities';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3);
child.entity = mesh;
child.transform.translation = new Vector3(2.0, 0.0, 0.0);globalTransform world-space transformation matrix (read-only) प्रदान करता है, सभी पूर्वज ट्रांसफ़ॉर्म्स को जोड़कर गणना किया गया।.
चरण 5: वृक्ष को ट्रैवर्स करें
हर नोड को विज़िट करने के लिए एक पुनरावर्ती फ़ंक्शन लिखें। जाँचें node.entity और node.childNodes प्रत्येक स्तर पर:
function traverse(node: any, depth = 0): void {
const indent = ' '.repeat(depth);
const entityType = node.entity ? node.entity.constructor.name : 'none';
console.log(`${indent}${node.name} [${entityType}]`);
for (const child of node.childNodes) {
traverse(child, depth + 1);
}
}
traverse(scene.rootNode);ऊपर बनाई गई पदानुक्रम के लिए, आउटपुट इस प्रकार होगा:
[none]
parent [none]
child [Mesh]रूट नोड का नाम एक खाली स्ट्रिंग है क्योंकि Scene यह इसे बिना नाम तर्क के बनाता है।.
किसी विशिष्ट प्रकार में कास्ट करने से पहले हमेशा नल जाँच के साथ एंटिटी एक्सेस को सुरक्षित रखें। हर नोड में एंटिटी नहीं होती।.
चरण 6: glTF या GLB में सहेजें
उपयोग करें GltfSaveOptions आउटपुट फ़ॉर्मेट को नियंत्रित करने के लिए। सेट करें binaryMode = true एकल स्व-निहित बनाने के लिए .glb फ़ाइल; इसे छोड़ दें false JSON के लिए .gltf + .bin साइडकार जोड़ी:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4, Vector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3);
child.entity = mesh;
child.transform.translation = new Vector3(2.0, 0.0, 0.0);
const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true; // write a single .glb file
scene.save('scene.glb', GltfFormat.getInstance(), saveOpts);
console.log('Scene saved to scene.glb');पास करें GltfFormat.getInstance() फ़ॉर्मेट तर्क के रूप में ताकि लाइब्रेरी फ़ाइल एक्सटेंशन की परवाह किए बिना सही एन्कोडर का उपयोग करे।.
टिप्स और सर्वोत्तम प्रथाएँ
- उपयोग करें
createChildNode()निर्माण करने के बजायNodeसीधे:createChildNode()स्वचालित रूप से पैरेंट-चाइल्ड संबंध को जोड़ता है और ट्री में नोड को रजिस्टर करता है।. - जाँचें
node.entityentity properties तक पहुँचने से पहले: कई नोड्स (ग्रुप नोड्स, बोन, लोकेटर) में कोई entity नहीं होती। हमेशा null check के साथ guard करें याinstanceofपरीक्षण।. - सेट
translationचाइल्ड नोड्स पर, mesh vertices पर नहीं: संशोधित करनाtransform.translationनॉन-डिस्ट्रक्टिव है और parent transforms के साथ संयोज्य है।. - प्राथमिकता दें
binaryMode = trueGLB के लिए: एकल.glbफ़ाइल वितरित करने, ब्राउज़रों में लोड करने, और game engines में इम्पोर्ट करने में split की तुलना में आसान है.gltf+.binफ़ॉर्मेट।. - के माध्यम से ट्रैवर्स करें
for...ofपरchildNodes: संख्यात्मक इंडेक्सिंग से बचें; forward compatibility के लिए iterable को सीधे उपयोग करें।.
सामान्य समस्याएँ
| लक्षण | संभावित कारण | समाधान |
|---|---|---|
child.entity = mesh निर्यात पर कोई प्रभाव नहीं पड़ता | इकाई को गलत नोड स्तर पर सौंपा गया | असाइन करें entity लीफ़ नोड तक, ग्रुप नोड तक नहीं |
node.entity हमेशा होता है null | केवल जाँच rootNode खुद | पुनरावृत्ति करें node.childNodes; rootNode आमतौर पर कोई इकाई नहीं होती |
| परिवर्तन GLB व्यूअर में प्रतिबिंबित नहीं होता | globalTransform अपडेट नहीं हुआ | globalTransform सेव पर गणना किया जाता है; सेट transform.translation कॉल करने से पहले scene.save() |
GLB एक अलग बनाता है .bin sidecar | binaryMode डिफ़ॉल्ट रूप से false | सेट करें saveOpts.binaryMode = true |
See Also
- विशेषताएँ और कार्यात्मकताएँ: सभी फीचर क्षेत्रों के लिए पूर्ण API संदर्भ।.
- फ़ॉर्मेट समर्थन: समर्थित 3D फ़ॉर्मेट, पढ़ने/लिखने की क्षमता, और फ़ॉर्मेट विकल्प।.
- प्रोग्रामेटिक रूप से 3D Mesh कैसे बनाएं