Cara Menyimpan Adegan 3D dalam Python
Aspose.3D FOSS untuk Python membolehkan anda menyimpan Scene ke mana-mana format output yang disokong menggunakan satu panggilan Scene.save(). Pengesanan format adalah automatik apabila anda menghantar laluan fail; untuk pilihan lanjutan seperti output binari atau penyematan tekstur, anda menyediakan objek save‑options khusus format.
Panduan Langkah demi Langkah
Langkah 1: Pasang Pakej
Pasang Aspose.3D FOSS dari PyPI. Tiada perpustakaan asli diperlukan.
pip install aspose-3d-fossVersi Python yang disokong: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Langkah 2: Import Kelas yang Diperlukan
Secara minimum anda memerlukan Scene. Import pengeksport khusus format atau kelas pilihan‑simpan hanya apabila anda memerlukan kelakuan bukan lalai.
from aspose.threed import SceneUntuk pilihan khusus format:
from aspose.threed.formats.gltf import GltfSaveOptions, GltfExporter
from aspose.threed.formats.stl import StlFormat, StlSaveOptions
from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions
from aspose.threed.formats.collada import ColladaExporter, ColladaSaveOptionsLangkah 3: Muatkan Adegan
Muatkan adegan sedia ada dari cakera menggunakan Scene.from_file(). Perpustakaan mengesan format sumber secara automatik daripada sambungan fail. Untuk membina adegan dari awal, lihat How to Build a Mesh in Python.
# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")Sebagai alternatif, buka satu adegan dengan pilihan eksplisit melalui Scene.open():
from aspose.threed import Scene
scene = Scene()
scene.open("input.fbx")Langkah 4: Simpan ke STL
Panggil Scene.save() dengan laluan .stl. Secara lalai output ialah ASCII STL. Untuk menulis STL binari (fail lebih kecil, tiada pengepala yang boleh dibaca manusia) gunakan StlSaveOptions.
# ASCII STL — format detected from the .stl extension
scene.save("output.stl")
# Binary STL — smaller file size
from aspose.threed.formats.stl import StlFormat, StlSaveOptions
stl_format = StlFormat()
options = stl_format.create_save_options()
options.binary_mode = True
scene.save("output_binary.stl", options)Langkah 5: Simpan ke glTF atau GLB
Fail GLTF 2.0 boleh dieksport menggunakan GltfExporter dan GltfSaveOptions. Tetapkan binary_mode = True untuk menghasilkan bundle binari .glb yang berdiri sendiri; tetapkan binary_mode = False untuk format .gltf berasaskan JSON.
import io
from aspose.threed.formats.gltf import GltfExporter, GltfSaveOptions
# Text glTF
options = GltfSaveOptions()
options.binary_mode = False
options.file_name = "output.gltf"
exporter = GltfExporter()
with open("output.gltf", "wb") as f:
stream = io.BytesIO()
exporter.export(scene, stream, options)
f.write(stream.getvalue())
# Binary GLB
options_glb = GltfSaveOptions()
options_glb.binary_mode = True
options_glb.file_name = "output.glb"
stream_glb = io.BytesIO()
exporter.export(scene, stream_glb, options_glb)
with open("output.glb", "wb") as f:
f.write(stream_glb.getvalue())Langkah 6: Simpan ke FBX
Adegan FBX dieksport melalui FbxExporter. Gunakan FbxSaveOptions untuk mengaktifkan pemampatan atau menyematkan tekstur ke dalam fail output.
from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions
options = FbxSaveOptions()
options.enable_compression = True
options.embed_textures = False # keep textures as separate files
exporter = FbxExporter()
exporter.save(scene, "output.fbx", options)Langkah 7: Simpan ke OBJ atau Collada (DAE)
Untuk OBJ dan Collada, hantarkan laluan fail secara langsung kepada Scene.save(). Perpustakaan mengesan format daripada sambungan.
# OBJ — format auto-detected from .obj extension
scene.save("output.obj")
# Collada DAE — with material and coordinate-system options
from aspose.threed.formats.collada import ColladaExporter, ColladaSaveOptions
options = ColladaSaveOptions()
options.enable_materials = True
options.flip_coordinate_system = False
options.indented = True
exporter = ColladaExporter()
exporter.export(scene, open("output.dae", "wb"), options)Isu Umum dan Penyelesaian
Fail output kosong selepas scene.save()
Ini biasanya bermakna nod akar adegan tidak mempunyai nod anak dengan geometri. Sahkan bahawa setiap nod mesh telah dilampirkan kepada scene.root_node sebelum memanggil save. Periksa len(scene.root_node.child_nodes) selepas membina adegan.
AttributeError semasa membina geometri mesh
Kelas Mesh menyimpan verteks sebagai senarai titik kawalan dalaman. Untuk corak pembinaan mesh yang terperinci, rujuk artikel How to Build a Mesh in Python yang merangkumi penciptaan poligon, elemen verteks, dan data UV.
Output GLB lebih besar daripada yang dijangkakan
Binary GLB menyisipkan semua data geometri dan tekstur. Jika GltfSaveOptions.flip_tex_coord_v ditetapkan kepada True, satu laluan putar koordinat tambahan dimasukkan. Tetapkan kepada False jika anda tidak memerlukan pembalikan tekstur paksi V.
Pusingan import/eksport FBX kehilangan bahan
Eksport bahan FBX dikawal oleh FbxSaveOptions.export_legacy_material_properties. Tetapkan ini kepada True untuk menulis blok bahan FBX standard yang boleh dibaca oleh alat pihak ketiga.
Collada DAE tidak termasuk bahan
Tetapkan ColladaSaveOptions.enable_materials = True (ia ialah False secara lalai) sebelum mengeksport.
Soalan Lazim
Format apa yang boleh dieksport oleh Aspose.3D FOSS untuk Python?
Perpustakaan menyokong pengeksportan ke: STL, glTF 2.0 (teks dan binari GLB), FBX, OBJ, Collada (DAE), dan 3MF. Pengesanan format adalah automatik apabila anda menghantar rentetan laluan fail kepada Scene.save(); perpustakaan membaca sambungan untuk memilih pengeksport yang betul.
Adakah terdapat API eksport penstriman yang mengelakkan penulisan ke cakera?
Ya. GltfExporter.export(scene, stream, options) menulis ke mana-mana io.BytesIO atau objek seperti fail. Anda boleh menghantar penampan dalam memori secara langsung ke respons web atau pemprosesan selanjutnya tanpa menyentuh sistem fail.
Bagaimana saya menukar adegan dari satu format ke format lain?
Muatkan adegan dengan Scene.from_file("input.fbx") dan simpan dengan scene.save("output.gltf"). Pustaka mengendalikan penukaran dalam memori; tiada fail antara perantaraan diperlukan.
Bolehkah saya menyimpan pelbagai sub‑scene ke dalam fail berasingan?
Akses scene.sub_scenes untuk mengulangi setiap sub-scene, cipta objek Scene baru, lampirkan nod yang berkaitan, dan panggil save() pada setiap satu.
Adakah Scene.save() menimpa fail sedia ada secara senyap?
Ya. Perpustakaan tidak menghasilkan ralat jika fail sasaran sudah wujud; ia menulis semula. Tambahkan pemeriksaan kewujudan fail dalam kod anda jika anda perlu melindungi daripada penulisan semula secara tidak sengaja.