सीन ग्राफ के साथ काम करना

सीन ग्राफ के साथ काम करना

सभी 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.entity entity properties तक पहुँचने से पहले: कई नोड्स (ग्रुप नोड्स, बोन, लोकेटर) में कोई entity नहीं होती। हमेशा null check के साथ guard करें या instanceof परीक्षण।.
  • सेट translation चाइल्ड नोड्स पर, mesh vertices पर नहीं: संशोधित करना transform.translation नॉन-डिस्ट्रक्टिव है और parent transforms के साथ संयोज्य है।.
  • प्राथमिकता दें binaryMode = true GLB के लिए: एकल .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 sidecarbinaryMode डिफ़ॉल्ट रूप से falseसेट करें saveOpts.binaryMode = true

See Also

 हिन्दी