Cara Menyimpan Adegan 3D di Python
Aspose.3D FOSS for Python memungkinkan Anda menyimpan Scene ke format output yang didukung apa pun menggunakan satu panggilan Scene.save(). Deteksi format otomatis ketika Anda memberikan jalur file; untuk opsi lanjutan seperti output biner atau penyematan tekstur, Anda menyediakan objek opsi‑simpan yang spesifik format.
Panduan Langkah-demi-Langkah
Langkah 1: Instal Paket
Instal Aspose.3D FOSS dari PyPI. Tidak diperlukan perpustakaan native.
pip install aspose-3d-fossVersi Python yang didukung: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Langkah 2: Impor Kelas yang Diperlukan
Setidaknya Anda memerlukan Scene. Impor exporter atau kelas save-options khusus format hanya ketika Anda memerlukan perilaku non-default.
from aspose.threed import SceneUntuk opsi 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: Muat Adegan
Muat adegan yang ada dari disk menggunakan Scene.from_file(). Perpustakaan mendeteksi format sumber secara otomatis dari ekstensi file. Untuk membuat adegan dari awal sebagai gantinya, 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 adegan dengan opsi eksplisit melalui Scene.open():
from aspose.threed import Scene
scene = Scene()
scene.open("input.fbx")Langkah 4: Simpan ke STL
Panggil Scene.save() dengan jalur .stl. Secara default outputnya adalah ASCII STL. Untuk menulis STL biner (file lebih kecil, tanpa header yang dapat 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
File GLTF 2.0 dapat diekspor menggunakan GltfExporter dan GltfSaveOptions. Atur binary_mode = True untuk menghasilkan bundel biner .glb yang berdiri sendiri; atur binary_mode = False untuk format .gltf berbasis 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 diekspor melalui FbxExporter. Gunakan FbxSaveOptions untuk mengaktifkan kompresi atau menyematkan tekstur ke dalam file 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, berikan jalur file secara langsung ke Scene.save(). Perpustakaan mendeteksi format dari ekstensi.
# 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)Masalah Umum dan Solusi
File output kosong setelah scene.save()
Ini biasanya berarti node akar scene tidak memiliki node anak dengan geometri. Verifikasi bahwa setiap node mesh telah terlampir ke scene.root_node sebelum memanggil save. Periksa len(scene.root_node.child_nodes) setelah membangun scene.
AttributeError saat membangun geometri mesh
Kelas Mesh menyimpan vertex sebagai daftar kontrol‑poin internal. Untuk pola konstruksi mesh yang terperinci, lihat artikel Cara Membuat Mesh di Python yang mencakup pembuatan poligon, elemen vertex, dan data UV.
Output GLB lebih besar dari yang diharapkan
Binary GLB menyisipkan semua data geometri dan tekstur. Jika GltfSaveOptions.flip_tex_coord_v diatur ke True, sebuah proses pembalikan koordinat tambahan disertakan. Atur ke False jika Anda tidak memerlukan pembalikan tekstur pada sumbu V.
FBX import/export round-trip loses materials
Ekspor material FBX dikendalikan oleh FbxSaveOptions.export_legacy_material_properties. Atur ini ke True untuk menulis blok material FBX standar yang dapat dibaca oleh alat pihak ketiga.
Collada DAE tidak menyertakan material
Set ColladaSaveOptions.enable_materials = True (ini adalah False secara default) sebelum mengekspor.
Pertanyaan yang Sering Diajukan
Format apa yang dapat diekspor oleh Aspose.3D FOSS untuk Python?
Perpustakaan mendukung ekspor ke: STL, glTF 2.0 (teks dan biner GLB), FBX, OBJ, Collada (DAE), dan 3MF. Deteksi format bersifat otomatis ketika Anda memberikan string jalur‑berkas ke Scene.save(); perpustakaan membaca ekstensi untuk memilih pengekspor yang tepat.
Apakah ada API ekspor streaming yang menghindari penulisan ke disk?
Ya. GltfExporter.export(scene, stream, options) menulis ke setiap io.BytesIO atau objek mirip file. Anda dapat meneruskan buffer dalam memori secara langsung ke respons web atau pemrosesan lebih lanjut tanpa menyentuh sistem berkas.
Bagaimana cara mengonversi scene dari satu format ke format lain?
Muat adegan dengan Scene.from_file("input.fbx") dan simpan dengan scene.save("output.gltf"). Perpustakaan menangani konversi dalam memori; tidak diperlukan file perantara.
Apakah saya dapat menyimpan beberapa sub-scene ke file terpisah?
Akses scene.sub_scenes untuk mengiterasi setiap sub‑scene, buat objek Scene baru, lampirkan node yang relevan, dan panggil save() pada masing‑masing.
Apakah Scene.save() menimpa file yang ada secara diam‑diam?
Ya. Perpustakaan tidak menghasilkan error jika file target sudah ada; ia menimpanya. Tambahkan pemeriksaan keberadaan file dalam kode Anda jika Anda perlu melindungi dari penimpaan yang tidak disengaja.