TypeScript में प्रोग्रामेटिक रूप से 3D मेष कैसे बनाएं

TypeScript में प्रोग्रामेटिक रूप से 3D मेष कैसे बनाएं

Aspose.3D FOSS for TypeScript आपको किसी भी फ़ाइल को लोड किए बिना पूरी तरह कोड में 3D ज्यामिति बनाने की अनुमति देता है। आप वर्टेक्स स्थितियों को कंट्रोल पॉइंट्स के रूप में परिभाषित करते हैं, इंडेक्स द्वारा पॉलीगॉन फ़ेसेस निर्दिष्ट करते हैं, और वैकल्पिक वर्टेक्स तत्व जैसे नॉर्मल्स, UVs, या वर्टेक्स रंग संलग्न करते हैं। परिणाम को किसी भी लिखने योग्य फ़ॉर्मेट में सहेजा जा सकता है: glTF, GLB, STL, FBX, या COLLADA।

पूर्वापेक्षाएँ

  • Node.js 18 या बाद में
  • TypeScript 5.0 या बाद में
  • @aspose/3d स्थापित (Step 1 देखें)

चरण-दर-चरण गाइड

चरण 1: @aspose/3d स्थापित करें

npm install @aspose/3d

कोई नेटिव ऐडऑन या सिस्टम लाइब्रेरीज़ आवश्यक नहीं हैं। पैकेज में TypeScript टाइप डिफिनिशन शामिल हैं।

न्यूनतम tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "strict": true
  }
}

चरण 2: एक दृश्य और नोड बनाएं

एक Scene शीर्ष-स्तरीय कंटेनर है। सभी ज्यामिति को दृश्य वृक्ष के भीतर एक Node से संलग्न होना चाहिए:

import { Scene } from '@aspose/3d';

const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');

createChildNode(name) एक नामित नोड बनाता है और इसे वर्तमान नोड के बच्चे के रूप में जोड़ता है। लौटाया गया Node ऑब्जेक्ट वह है जहाँ आप चरण 7 में मेष को संलग्न करेंगे।


Step 3: मेष ऑब्जेक्ट बनाएं

Mesh वर्टेक्स स्थितियों और बहुभुज परिभाषाओं को रखता है। वैकल्पिक नाम के साथ एक बनाएं:

import { Mesh } from '@aspose/3d/entities';

const mesh = new Mesh('triangle');

mesh शुरू में खाली है: कोई vertices नहीं और कोई faces नहीं। आप उन्हें अगले चरणों में जोड़ते हैं।


चरण 4: नियंत्रण बिंदु (वर्टिसेज) जोड़ें

कंट्रोल पॉइंट्स स्थानीय स्थान में वर्टेक्स स्थितियाँ होते हैं। Vector4 मानों को mesh.controlPoints में पुश करें। चौथा घटक (w) स्थितियों के लिए 1 है:

import { Vector4 } from '@aspose/3d/utilities';

mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0)); // index 0
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0)); // index 1
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0)); // index 2

आप बहुभुज चेहरों को परिभाषित करते समय इन स्थितियों को उनके शून्य‑आधारित सूचकांक द्वारा संदर्भित करते हैं।


चरण 5: बहुभुज चेहरों को बनाएं

createPolygon() क्रम में वर्टेक्स इंडेक्स सूचीबद्ध करके एक फेस को परिभाषित करता है। तीन इंडेक्स एक त्रिभुज बनाते हैं:

mesh.createPolygon(0, 1, 2);

आप क्वाड्स (चार इंडेक्स) या मनमाने बहुभुज भी परिभाषित कर सकते हैं उन फ़ॉर्मैट्स के लिए जो उनका समर्थन करते हैं। glTF के लिए, लाइब्रेरी निर्यात पर स्वचालित रूप से क्वाड्स और n-gons को triangulate करेगी।


चरण 6: वर्टेक्स नॉर्मल जोड़ें

नॉर्मल्स रेंडरिंग गुणवत्ता को सुधारते हैं। mesh.createElement() का उपयोग करके एक VertexElementNormal बनाएं, नॉर्मल वेक्टर को एक एरे में एकत्र करें, फिर उन्हें संग्रहीत करने के लिए setData() को कॉल करें। data गेटर एक डिफेन्सिव कॉपी लौटाता है — इसमें पुश करने से कोई प्रभाव नहीं पड़ता। नॉर्मल डेटा के लिए FVector3 (सिंगल-प्रिसीजन फ़्लोट) का उपयोग करें, Vector4 नहीं।

import { VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { FVector3 } from '@aspose/3d/utilities';

const normals = mesh.createElement(
    VertexElementType.NORMAL,
    MappingMode.CONTROL_POINT,
    ReferenceMode.DIRECT
) as VertexElementNormal;

// Build the normal array, then call setData() — do NOT push to normals.data
normals.setData([
    new FVector3(0, 0, 1), // normal for vertex 0 (pointing +Z)
    new FVector3(0, 0, 1), // normal for vertex 1
    new FVector3(0, 0, 1), // normal for vertex 2
]);

MappingMode.CONTROL_POINT का अर्थ है प्रत्येक शीर्ष पर एक सामान्य। ReferenceMode.DIRECT का अर्थ है डेटा एरे को बहुभुज शीर्षांक द्वारा सीधे अनुक्रमित किया जाता है।


चरण 7: मेश को संलग्न करें और glTF में सहेजें

node.entity के माध्यम से मेश को नोड पर असाइन करें, फिर सीन को सहेजें:

import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

node.entity = mesh;

const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');

एक एकल स्व-समाहित .glb फ़ाइल बनाने के लिए, saveOpts.binaryMode = true सेट करें और आउटपुट फ़ाइल एक्सटेंशन को .glb में बदलें।

पूर्ण उदाहरण

निम्नलिखित सभी चरणों को मिलाकर पूर्ण स्क्रिप्ट है:

import { Scene } from '@aspose/3d';
import { Mesh, VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { Vector4, FVector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');

const mesh = new Mesh('triangle');

mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0));

mesh.createPolygon(0, 1, 2);

const normals = mesh.createElement(
    VertexElementType.NORMAL,
    MappingMode.CONTROL_POINT,
    ReferenceMode.DIRECT
) as VertexElementNormal;

// setData() is the correct API — normals.data returns a defensive copy; pushing to it has no effect
normals.setData([
    new FVector3(0, 0, 1),
    new FVector3(0, 0, 1),
    new FVector3(0, 0, 1),
]);

node.entity = mesh;

const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');

ts-node के साथ चलाएँ:

npx ts-node triangle.ts

सामान्य समस्याएँ

IssueCauseFix
mesh.controlPoints.length पुश के बाद 0 हैमेश किसी नोड द्वारा संदर्भित नहीं हैnode.entity असाइन करने से पहले पुश करें; क्रम का महत्व नहीं है, लेकिन संदर्भ की जाँच करें
निर्यात खाली ज्यामिति बनाता हैnode.entity असाइन नहीं किया गयाscene.save() को कॉल करने से पहले node.entity = mesh सुनिश्चित करें
नॉर्मल गिनती में असंगतिsetData() को पास किया गया एरे controlPoints से छोटा हैMappingMode.CONTROL_POINT का उपयोग करते समय प्रत्येक कंट्रोल पॉइंट के लिए एक FVector3 प्रविष्टि जोड़ें
glTF व्यूअर काली मेश दिखाता हैनॉर्मल अंदर की ओर इशारा कर रहे हैंcreatePolygon में विंडिंग क्रम उलटें (जैसे, 0, 2, 1) या नॉर्मल वेक्टर को नकारें
TypeScript: ’normals.data’ प्रॉपर्टी नहीं मिलीगलत इम्पोर्ट पाथVertexElementNormal को @aspose/3d/entities से इम्पोर्ट करें, @aspose/3d रूट से नहीं

अक्सर पूछे जाने वाले प्रश्न

क्या मैं त्रिकोणों के बजाय क्वाड बना सकता हूँ?
हाँ। चार इंडेक्स को createPolygon(0, 1, 2, 3) में पास करें। लाइब्रेरी क्वाड को त्रिकोणों में बदल देती है जब वह उन फ़ॉर्मैट्स में निर्यात करती है जिन्हें त्रिकोण चाहिए (glTF, STL).

MappingMode.CONTROL_POINT और MappingMode.POLYGON_VERTEX के बीच क्या अंतर है?
CONTROL_POINT प्रत्येक अद्वितीय शीर्ष बिंदु पर एक मान संग्रहीत करता है। POLYGON_VERTEX प्रत्येक बहुभुज‑शीर्ष बिंदु जोड़े पर एक मान संग्रहीत करता है, जिससे जब कोई शीर्ष बिंदु कई बहुभुजों का हिस्सा हो (कठोर किनारे) तो अलग‑अलग सामान्य वेक्टर संभव होते हैं।

क्या मुझे STL में सहेजने से पहले मेष को ट्रायएंगुलेट करना आवश्यक है?
नहीं। लाइब्रेरी ट्रायएंगुलेशन को स्वचालित रूप से संभालती है जब ऐसे फ़ॉर्मेट में निर्यात किया जाता है जिनमें ट्रायएंगुलेशन आवश्यक होता है। आप मेष में क्वाड और n-gons परिभाषित कर सकते हैं और सीधे STL में सहेज सकते हैं।

UV निर्देशांक कैसे जोड़ें?
mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) का उपयोग करके VertexElementUV बनाएं, फिर setData([...]) को FVector2 या FVector3 मानों की एक array के साथ कॉल करें — प्रत्येक नियंत्रण बिंदु के लिए एक। data getter एक कॉपी लौटाता है; इसे सीधे पुश न करें।

क्या मैं एक सीन में कई मेष बना सकता हूँ?
हाँ। scene.rootNode के तहत कई नोड बनाएं और प्रत्येक नोड की entity प्रॉपर्टी को एक अलग Mesh असाइन करें।

और देखें

 हिन्दी