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

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

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

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

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

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

asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.

Python संस्करणों का समर्थन किया गया है: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


चरण 2: दृश्य वर्ग का आयात करें

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

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: दृश्य नोड्स के माध्यम से पार करें

एक लोड दृश्य एक पेड़ है 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 0 या अधिक ले जा सकते हैं। Entity वस्तुओं (मशीनें, कैमरा, रोशनी) देखें node.entities देखते हैं कि क्या जुड़ा हुआ है।.


चरण 5: Vertex और Polygon डेटा तक पहुंच

एक नोड के इकाई को काटें 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 एक सूची है, जिसमें प्रत्येक आंतरिक सूची एक चेहरे के लिए नियंत्रण बिंदु सूचियों का आदेश सेट है।.


चरण 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. के लिए GTTF, उपयोग करें GltfLoadOptions.देखें The API संदर्भ एक पूर्ण सूची के लिए।.


सामान्य समस्याएं और सुधार

फ़ाइल में गलती जब कॉल करें 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 vs Z-Up, बाएं हाथ vs दाएं) सेट करें। 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 अलग-अलग तारों से उदाहरण सुरक्षित हैं जब तक आप एक को साझा नहीं करते हैं Scene बिना बाहरी लॉक के तारों पर।.

 हिन्दी