कैसे लोड करें 3D मॉडल Python में

कैसे लोड करें 3D मॉडल Python में

Aspose.3D FOSS for Python एक सरल API प्रदान करता है 3D फ़ाइलें खोलने के लिए, बिना किसी मूल निर्भरताओं के। फ़ाइल को एक Scene ऑब्जेक्ट में, आप नोड पदानुक्रम को पार कर सकते हैं और दृश्य में प्रत्येक मेष के लिए कच्चा ज्यामिति डेटा पढ़ सकते हैं।.

स्टेप बाय स्टेप गाइड

स्टेप 1: पैकेज स्थापित करें

PyPI से Aspose.3D FOSS स्थापित करें। कोई अतिरिक्त सिस्टम लाइब्रेरी आवश्यक नहीं है।.

pip install aspose-3d-foss

समर्थित Python संस्करण: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


स्टेप 2: Scene क्लास इम्पोर्ट करें

यह Scene क्लास सभी 3D डेटा के लिए शीर्ष-स्तर कंटेनर है। इसे उन सभी लोड-ऑप्शन क्लासों के साथ इम्पोर्ट करें जिनकी आपको आवश्यकता है।.

from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions

सभी सार्वजनिक क्लासें यहाँ स्थित हैं aspose.threed या इसके सब-पैकेजों में (aspose.threed.entities, aspose.threed.formats, aspose.threed.utilities).


स्टेप 3: फ़ाइल लोड करें

स्थैतिक का उपयोग करें Scene.from_file() विधि का उपयोग करके किसी भी समर्थित फ़ॉर्मेट को खोलें। लाइब्रेरी फ़ाइल एक्सटेंशन से फ़ॉर्मेट को स्वचालित रूप से पहचानती है।.

##Automatic format detection
scene = Scene.from_file("model.obj")

वैकल्पिक रूप से, एक बनाएं Scene इंस्टेंस और कॉल open(); उपयोगी जब आप लोड विकल्प पास करना चाहते हैं या त्रुटियों को स्पष्ट रूप से संभालना चाहते हैं:

scene = Scene()
scene.open("model.obj")

दोनों मेथड OBJ, STL (बाइनरी और ASCII), glTF 2.0 / GLB, COLLADA (DAE), और 3MF फ़ाइलों को समर्थन देते हैं।.


स्टेप 4: Scene नोड्स को ट्रैवर्स करें

एक लोड किया गया सीन वस्तुओं का पेड़ है Node ऑब्जेक्ट्स जो मूल रूप से स्थित हैं scene.root_node. सभी नोड्स को खोजने के लिए पुनरावर्ती रूप से इटरेट करें:

from aspose.threed import Scene, Node

scene = Scene.from_file("model.obj")

def walk(node: Node, depth: int = 0) -> None:
    indent = "  " * depth
    print(f"{indent}Node: {node.name!r}")
    for child in node.child_nodes:
        walk(child, depth + 1)

walk(scene.root_node)

प्रत्येक Node शून्य या अधिक ले जा सकता है Entity ऑब्जेक्ट्स (मेशेज़, कैमरे, लाइट्स). जांचें node.entities यह देखने के लिए कि क्या संलग्न है।.


चरण 5: वर्टेक्स और पॉलीगॉन डेटा तक पहुँचें

एक नोड की एंटिटी को कास्ट करें Mesh और उसके कंट्रोल पॉइंट्स (वर्टेक्स पोजीशन) तथा पॉलीगॉन्स (फेस इंडेक्स लिस्ट) पढ़ें:

from aspose.threed import Scene
from aspose.threed.entities import Mesh

scene = Scene.from_file("model.obj")

for node in scene.root_node.child_nodes:
    for entity in node.entities:
        if isinstance(entity, Mesh):
            mesh: Mesh = entity
            print(f"Mesh '{node.name}': "
                  f"{len(mesh.control_points)} vertices, "
                  f"{len(mesh.polygons)} polygons")

            # First vertex position
            if mesh.control_points:
                v = mesh.control_points[0]
                print(f"  First vertex: ({v.x:.4f}, {v.y:.4f}, {v.z:.4f})")

            # First polygon face (list of control-point indices)
            if mesh.polygons:
                print(f"  First polygon: {mesh.polygons[0]}")

mesh.control_points एक सूची है Vector4 ऑब्जेक्ट्स; x, y, z स्थिति को ले जाएँ और w समरूप निर्देशांक है (आमतौर पर 1.0)।.

mesh.polygons एक पूर्णांकों की सूचियों की सूची है, जहाँ प्रत्येक आंतरिक सूची एक चेहरे के लिए control-point indices का क्रमबद्ध सेट है।.


चरण 6: फ़ॉर्मेट‑विशिष्ट लोड विकल्प लागू करें

OBJ फ़ाइल की व्याख्या कैसे की जाती है, इस पर सूक्ष्म-स्तरीय नियंत्रण के लिए, एक पास करें। ObjLoadOptions उदाहरण को scene.open():

from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions

options = ObjLoadOptions()
options.flip_coordinate_system = True   # Convert right-hand Y-up to Z-up
options.scale = 0.01                    # Convert centimetres to metres
options.enable_materials = True         # Load .mtl material file
options.normalize_normal = True         # Normalize all normals to unit length

scene = Scene()
scene.open("model.obj", options)

STL फ़ाइलों के लिए, समकक्ष क्लास है StlLoadOptions. glTF के लिए, उपयोग करें GltfLoadOptions. देखें API संदर्भ पूरी सूची के लिए।.


सामान्य समस्याएँ और समाधान

FileNotFoundError कॉल करने पर Scene.from_file()

पथ को रनटाइम पर कार्य निर्देशिका के सापेक्ष पूर्ण या सही होना चाहिए। उपयोग करें pathlib.Path विश्वसनीय पथ बनाने के लिए:

from pathlib import Path
from aspose.threed import Scene

path = Path(__file__).parent / "assets" / "model.obj"
scene = Scene.from_file(str(path))

mesh.polygons STL फ़ाइल लोड करने के बाद खाली है

STL फ़ाइलें त्रिकोणों को कच्चे फ़ैसेट के रूप में संग्रहीत करती हैं, न कि एक अनुक्रमित मेष के रूप में। लोड करने के बाद, बहुभुज उन फ़ैसेट से संश्लेषित किए जाते हैं। यदि polygons खाली दिखता है, जाँचें len(mesh.control_points); यदि गणना 3 का गुणज है तो ज्यामिति अनइंडेक्स्ड रूप में संग्रहीत होती है और प्रत्येक क्रमिक तीन शीर्ष बिंदु एक त्रिकोण बनाते हैं।.

निर्देशांक प्रणाली का मेल नहीं (मॉडल घुमाया या प्रतिबिंबित दिख रहा है)

विभिन्न टूल अलग-अलग सम्मेलनों का उपयोग करते हैं (Y‑up बनाम Z‑up, बाएँ‑हाथ बनाम दाएँ‑हाथ)। सेट ObjLoadOptions.flip_coordinate_system = True या रूट नोड के लिए एक घूर्णन लागू करें Transform लोड करने के बाद।.

AttributeError: 'NoneType' object has no attribute 'polygons'

किसी नोड की एंटिटी सूची में गैर‑मेश एंटिटीज़ (कैमरे, लाइट्स) हो सकते हैं। हमेशा … के साथ गार्ड रखें isinstance(entity, Mesh) कास्ट करने से पहले।.


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

मैं कौन‑से 3D फ़ॉर्मेट लोड कर सकता हूँ?

OBJ (Wavefront), STL (बाइनरी और ASCII), glTF 2.0 / GLB, COLLADA (DAE), और 3MF। FBX फ़ाइल टोकनाइज़ेशन आंशिक रूप से समर्थित है लेकिन पूर्ण पार्सिंग अभी तक पूरी नहीं हुई है।.

क्या OBJ फ़ाइल लोड करने से भी … लोड हो जाता है? .mtl सामग्री?

हाँ, जब ObjLoadOptions.enable_materials = True (डिफ़ॉल्ट). लाइब्रेरी खोजती है .mtl फ़ाइल उसी निर्देशिका में जहाँ .obj फ़ाइल। यदि .mtl ग़ायब है, ज्यामिति अभी भी लोड हो जाती है और एक चेतावनी जारी की जाती है।.

क्या मैं पथ के बजाय बाइट स्ट्रीम से फ़ाइल लोड कर सकता हूँ?

हाँ।. scene.open() किसी भी फ़ाइल-समतुल्य ऑब्जेक्ट को स्वीकार करता है जिसमें एक .read() विधि के साथ-साथ फ़ाइल पाथ स्ट्रिंग भी। एक खुला बाइनरी स्ट्रीम पास करें (उदाहरण के लिए,., io.BytesIO) सीधे।. Scene.from_file() केवल फ़ाइल पथ स्ट्रिंग को स्वीकार करता है।.

मैं सतह के नॉर्मल कैसे प्राप्त करूँ?

लोड करने के बाद, जाँचें mesh.get_element(VertexElementType.NORMAL). यह एक लौटाता है VertexElementNormal जिसका data सूची में प्रत्येक संदर्भ के लिए एक सामान्य वेक्टर होता है, जो अनुसार मैप किया गया है mapping_mode और reference_mode.

from aspose.threed.entities import Mesh, VertexElementType

normals = mesh.get_element(VertexElementType.NORMAL)
if normals:
    print(normals.data[0])  # First normal vector

क्या लाइब्रेरी एक साथ कई फ़ाइलों को लोड करने के लिए थ्रेड-सेफ़ है?

प्रत्येक Scene वस्तु स्वतंत्र है। अलग-अलग फ़ाइलों को अलग-अलग में लोड करना Scene विभिन्न थ्रेड्स से instances सुरक्षित है जब तक आप एक ही को साझा नहीं करते Scene threads के बीच external locking के बिना।.

 हिन्दी