3D मॉडल को Python में कैसे परिवर्तित करें
Aspose.3D FOSS के साथ प्रारूप रूपांतरण Python के लिए एक दो-चरण प्रक्रिया है: लोड करने के Scene ऑब्जेक्ट, फिर वांछित आउटपुट प्रारूप में सहेजें. क्योंकि सभी भूमध्यसागरी एक आम स्मृति में प्रतिनिधित्व में रखा जाता है, कोई फ़ॉर्म-विशिष्ट मध्यवर्ती कदम की आवश्यकता नहीं होती है. नीचे दिए गए अनुभागों में काम कोड के साथ सबसे आम रूपांतरण दिखाई देते हैं.
कदम-दर-चरण गाइड
चरण 1: पैकेज स्थापित करें
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
कोई सिस्टम लाइब्रेरी, संकलक या अतिरिक्त कार्यकाल निर्भरता की आवश्यकता नहीं है।.
चरण 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() एक प्रारूप-विशिष्ट सहेजें विकल्प वस्तु को पार करें बाइनरी vs ASCII आउटपुट, समन्वय एक्स और संपीड़न पर नियंत्रण के लिए।.
STL से OBJ (बिना)
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")जीपीएल 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")एक स्व-कंटेनर जीएलबी बाइनरी के बजाय बचत करने के लिए .gltf + बाहरी बफर, उत्पादन विस्तार को बदलने के लिए .glb:
scene.save("model.glb", save_opts)3MF के लिए OBJ
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 पैसर का चयन करने के लिए एक्सटनेस का उपयोग करता है।.
GST का उत्पादन संरचनाओं की कमी है
Aspose.3D FOSS रूपांतरण के माध्यम से भूमेट्री और सामग्री गुणों को ले जाता है. यदि स्रोत OBJ बाहरी छवि फ़ाइलों का संदर्भ देता है, तो .mtl, ये छवि फ़ाइलों को स्वचालित रूप से कॉपी नहीं किया जाता है, साथ ही साथ .gltf. सहेजने के बाद मैन्युअल रूप से आउटपुट निर्देशिका में संरचना छवियों को कॉपी करें।.
STL आउटपुट अंदर-आउत दिखता है (पृथ्वी सामान्य फ्लिप)
STL विंडिंग-ऑर्डर मेटाडेटा नहीं लेता है. यदि उत्पादन सामान्य को उलट दिया जाता है, तो सेट करें StlSaveOptions विकल्प यदि उपलब्ध है, या लोड के दौरान कोड प्रणाली फ्लिप: ObjLoadOptions.flip_coordinate_system = True.
ValueError: unsupported format जब बचत
फ़ाइल एक्सटेंशन की जांच करें, यह एक है .obj, .stl, .gltf, .glb, .dae, .3mf. एक्सटेंशन लिनक्स पर मामले की संवेदनशीलता है।.
बहुत बड़ी फ़ाइलें धीमी रूपांतरण का कारण बनती हैं
Aspose.3D FOSS स्मृति में भूमेट्री को संसाधित करता है. लाखों पॉलीगोन वाले फ़ाइलों के लिए, पर्याप्त रैम सुनिश्चित करें. वर्तमान में कोई स्ट्रीम-लिपिंग एपीआई नहीं है।.
अक्सर पूछे जाने वाले प्रश्न (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-GLTF रूपांतरण को जीवित रखेगी?
बेसिक फोंग / लैम्बर्ट सामग्री गुण (डिफ्यूज रंग) के माध्यम से ले जाया जाता है Scene मॉडल और glTF सामग्री ब्लॉक में लिखा. प्रक्रियात्मक या अनुकूलित छाया पैरामीटर, जो gl TF सामग्रियों के मॉड्यूल में व्यक्त नहीं किया जा सकता है, को छोड़ दिया जाता है।.
क्या मैं कई फ़ाइलों को एक लूप में परिवर्तित कर सकता हूं?
हाँ, हर एक 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 जैसे प्रारंभिक स्वरुप पूरी हिरेसत बनाए रखते हैं.