Python में 3D मॉडल कैसे बदलें
Aspose.3D FOSS for Python के साथ फ़ॉर्मेट रूपांतरण दो‑चरणीय प्रक्रिया है: एक Scene ऑब्जेक्ट में लोड करें, फिर इच्छित आउटपुट फ़ॉर्मेट में सहेजें। क्योंकि सभी ज्यामिति एक सामान्य इन‑मेमोरी प्रतिनिधित्व में रखी जाती है, इसलिए फ़ॉर्मेट‑विशिष्ट मध्यवर्ती चरणों की आवश्यकता नहीं होती। नीचे के अनुभाग सबसे सामान्य रूपांतरणों को कार्यशील कोड के साथ दिखाते हैं।
चरण-दर-चरण मार्गदर्शिका
चरण 1: पैकेज स्थापित करें
pip install aspose-3d-fossकोई सिस्टम लाइब्रेरी, कंपाइलर, या अतिरिक्त रनटाइम निर्भरताएँ आवश्यक नहीं हैं।
चरण 2: स्रोत मॉडल लोड करें
सबसे सरल मामले के लिए Scene.from_file() का उपयोग करें: फ़ॉर्मेट फ़ाइल एक्सटेंशन से स्वचालित रूप से पता लगाया जाता है:
from aspose.threed import Scene
scene = Scene.from_file("model.obj")OBJ फ़ाइलों के लिए जहाँ आपको निर्देशांक प्रणाली या सामग्री लोडिंग पर नियंत्रण चाहिए, scene.open() को ObjLoadOptions के साथ उपयोग करें:
from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions
options = ObjLoadOptions()
options.flip_coordinate_system = True # Convert to Z-up if needed
options.enable_materials = True # Load the accompanying .mtl file
options.normalize_normal = True
scene = Scene()
scene.open("model.obj", options)दोनों दृष्टिकोण अगले सहेजने के चरण के लिए एक समान Scene ऑब्जेक्ट उत्पन्न करते हैं।
चरण 3: लोडेड सीन का निरीक्षण करें
किसी रूपांतरण को लागू करने से पहले, यह जांचना उचित है कि ज्यामिति सही ढंग से लोड हुई है या नहीं। एक गायब फ़ाइल, असमर्थित FBX फीचर, या .mtl फ़ाइल के साथ पथ समस्या सभी एक खाली दृश्य उत्पन्न कर सकते हैं।
from aspose.threed import Scene
from aspose.threed.entities import Mesh
scene = Scene.from_file("model.obj")
mesh_count = 0
total_vertices = 0
def count_meshes(node) -> None:
global mesh_count, total_vertices
for entity in node.entities:
if isinstance(entity, Mesh):
mesh_count += 1
total_vertices += len(entity.control_points)
for child in node.child_nodes:
count_meshes(child)
count_meshes(scene.root_node)
print(f"Loaded {mesh_count} mesh(es), {total_vertices} total vertices")
if mesh_count == 0:
raise ValueError("Scene contains no geometry: check the source file path and format")चरण 4: लक्ष्य प्रारूप में सहेजें
आउटपुट पथ के साथ scene.save() को कॉल करें। बाइनरी बनाम ASCII आउटपुट, समन्वय अक्ष, और संपीड़न पर नियंत्रण के लिए फ़ॉर्मेट‑विशिष्ट save‑options ऑब्जेक्ट पास करें।
OBJ to STL (बाइनरी)
from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions
scene = Scene.from_file("model.obj")
save_opts = StlSaveOptions()
##StlSaveOptions defaults to binary output, which is more compact.
scene.save("model.stl", save_opts)
print("Saved model.stl")OBJ से glTF 2.0
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("model.obj")
save_opts = GltfSaveOptions()
scene.save("model.gltf", save_opts)
print("Saved model.gltf")एक स्व-समाहित GLB बाइनरी के रूप में सहेजने के लिए, .gltf + बाहरी बफ़र्स के बजाय, आउटपुट एक्सटेंशन को .glb में बदलें:
scene.save("model.glb", save_opts)OBJ से 3MF
from aspose.threed import Scene
from aspose.threed.formats import ThreeMfSaveOptions
scene = Scene.from_file("model.obj")
save_opts = ThreeMfSaveOptions()
scene.save("model.3mf", save_opts)
print("Saved model.3mf")STL से glTF 2.0
स्रोत फ़ॉर्मेट की परवाह किए बिना वही पैटर्न लागू होता है:
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("input.stl")
scene.save("output.gltf", GltfSaveOptions())
print("Saved output.gltf")चरण 5: आउटपुट सत्यापित करें
सहेजने के बाद, पुष्टि करें कि आउटपुट फ़ाइल मौजूद है और उसका आकार शून्य नहीं है। अधिक विस्तृत जांच के लिए, इसे पुनः लोड करें और मेष गिनती की तुलना करें:
import os
from aspose.threed import Scene
from aspose.threed.entities import Mesh
output_path = "model.stl"
##Basic file-system check
size = os.path.getsize(output_path)
print(f"Output file size: {size} bytes")
if size == 0:
raise RuntimeError("Output file is empty: save may have failed silently")
##Round-trip verification: reload and count geometry
def _iter_nodes(node):
yield node
for child in node.child_nodes:
yield from _iter_nodes(child)
reloaded = Scene.from_file(output_path)
mesh_count = sum(
1
for node in _iter_nodes(reloaded.root_node)
for entity in node.entities
if isinstance(entity, Mesh)
)
print(f"Round-trip check: {mesh_count} mesh(es) in output")सामान्य समस्याएँ और समाधान
आउटपुट फ़ाइल बनाई गई है लेकिन इसमें कोई ज्यामिति नहीं है
स्रोत फ़ाइल शून्य मेषों के साथ लोड हो सकती है। सहेजने से पहले चरण 3 से निरीक्षण चरण जोड़ें। यह भी पुष्टि करें कि फ़ाइल एक्सटेंशन वास्तविक फ़ॉर्मेट से मेल खाता है; Aspose.3D पार्सर चुनने के लिए एक्सटेंशन का उपयोग करता है।
glTF आउटपुट में टेक्सचर गायब हैं
Aspose.3D FOSS geometry और material properties को conversion के दौरान ले जाता है। यदि source OBJ external image files को .mtl में reference करता है, तो वे image files स्वचालित रूप से .gltf के साथ नहीं कॉपी होती हैं। सहेजने के बाद texture images को मैन्युअली output directory में कॉपी करें।
STL आउटपुट अंदर‑से‑बाहर दिखता है (फेस नॉर्मल उलटे)
STL में winding‑order मेटाडेटा नहीं होता। यदि आउटपुट नॉर्मल उल्टे हों, तो यदि उपलब्ध हो तो StlSaveOptions विकल्प सेट करें, या लोड के दौरान कोऑर्डिनेट सिस्टम को उलटें: ObjLoadOptions.flip_coordinate_system = True।
ValueError: unsupported format सहेजते समय
जाँचें कि आउटपुट फ़ाइल एक्सटेंशन .obj, .stl, .gltf, .glb, .dae, .3mf में से कोई एक है। एक्सटेंशन Linux पर केस‑सेंसिटिव होते हैं।
बहुत बड़ी फ़ाइलें रूपांतरण को धीमा कर देती हैं
Aspose.3D FOSS मेमोरी में ज्यामिति को प्रोसेस करता है। लाखों बहुभुजों वाली फ़ाइलों के लिए, पर्याप्त RAM सुनिश्चित करें। वर्तमान में कोई streaming-write API नहीं है।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
क्या मैं फ़ाइल को पहले डिस्क पर लिखे बिना परिवर्तित कर सकता हूँ?
हाँ। दोनों scene.open() और scene.save() फ़ाइल पथों के अतिरिक्त बाइनरी फ़ाइल‑समतुल्य वस्तुओं को स्वीकार करते हैं। लोड करने के लिए read() को लागू करने वाली या सहेजने के लिए write() को लागू करने वाली कोई भी वस्तु पास करें:
import io
from aspose.threed import Scene
# Load from an in-memory buffer
data = open('model.obj', 'rb').read()
scene = Scene()
scene.open(io.BytesIO(data))
# Save to an in-memory buffer
buf = io.BytesIO()
scene.save(buf)क्या FBX को रूपांतरण के लिए स्रोत फ़ॉर्मेट के रूप में समर्थन मिलता है?
FBX टोकनाइज़ेशन आंशिक रूप से लागू किया गया है, लेकिन पार्सर पूर्ण नहीं है। FBX इनपुट अधूरे दृश्यों का उत्पादन कर सकता है। विश्वसनीय स्रोत स्वरूपों के रूप में OBJ, STL, glTF, COLLADA, या 3MF का उपयोग करें।
क्या सामग्री OBJ-to-glTF रूपांतरण में बनी रहेंगी?
बेसिक फॉन्ग/लैम्बर्ट मैटेरियल प्रॉपर्टीज़ (डिफ्यूज़ कलर) Scene मॉडल के माध्यम से ले जाई जाती हैं और glTF मैटेरियल ब्लॉक में लिखी जाती हैं। प्रोसीजरल या कस्टम शेडर पैरामीटर जो glTF मैटेरियल मॉडल में व्यक्त नहीं किए जा सकते, उन्हें हटा दिया जाता है।
क्या मैं लूप में कई फ़ाइलें बदल सकता हूँ?
हाँ। प्रत्येक Scene.from_file() कॉल एक स्वतंत्र ऑब्जेक्ट बनाता है, इसलिए पाथ की सूची पर लूप बनाना सीधा है:
from pathlib import Path
from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions
source_dir = Path("input")
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)
opts = StlSaveOptions()
for obj_file in source_dir.glob("*.obj"):
scene = Scene.from_file(str(obj_file))
out_path = output_dir / obj_file.with_suffix(".stl").name
scene.save(str(out_path), opts)
print(f"Converted {obj_file.name} -> {out_path.name}")क्या रूपांतरण दृश्य पदानुक्रम (पैरेंट/चाइल्ड नोड्स) को संरक्षित करता है?
हाँ। नोड ट्री को तब तक संरक्षित किया जाता है जब तक लक्ष्य फ़ॉर्मेट अनुमति देता है। STL जैसे फ़ॉर्मेट केवल सपाट ज्यामिति को बिना नोड संरचना के संग्रहीत करते हैं; पदानुक्रम को सहेजते समय सपाट कर दिया जाता है। glTF और COLLADA जैसे फ़ॉर्मेट पूर्ण पदानुक्रम को बनाए रखते हैं।