Cara Mengonversi Model 3D di Python
Konversi format dengan Aspose.3D FOSS untuk Python adalah proses dua langkah: memuat ke dalam objek Scene, kemudian menyimpan ke format output yang diinginkan. Karena semua geometri disimpan dalam representasi memori bersama, tidak diperlukan langkah perantara yang spesifik format. Bagian di bawah ini menunjukkan konversi paling umum dengan kode yang berfungsi.
Panduan Langkah-demi-Langkah
Langkah 1: Instal Paket
pip install aspose-3d-fossTidak diperlukan perpustakaan sistem, kompiler, atau dependensi runtime tambahan.
Langkah 2: Muat Model Sumber
Gunakan Scene.from_file() untuk kasus paling sederhana: format terdeteksi secara otomatis dari ekstensi file:
from aspose.threed import Scene
scene = Scene.from_file("model.obj")Untuk file OBJ di mana Anda perlu mengontrol sistem koordinat atau pemuatan material, gunakan scene.open() dengan 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)Kedua pendekatan menghasilkan objek Scene yang identik untuk langkah penyimpanan berikutnya.
Langkah 3: Periksa Adegan yang Dimuat
Sebelum melakukan konversi, ada baiknya memeriksa bahwa geometri dimuat dengan benar. File yang hilang, fitur FBX yang tidak didukung, atau masalah jalur dengan file .mtl semuanya dapat menghasilkan adegan kosong.
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")Langkah 4: Simpan ke Format Target
Panggil scene.save() dengan jalur output. Berikan objek opsi‑simpan spesifik format untuk mengontrol output biner vs ASCII, sumbu koordinat, dan kompresi.
OBJ ke STL (biner)
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 ke 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")Untuk menyimpan sebagai file biner GLB yang berdiri sendiri alih‑alih .gltf + buffer eksternal, ubah ekstensi output menjadi .glb:
scene.save("model.glb", save_opts)OBJ ke 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 ke glTF 2.0
Pola yang sama berlaku terlepas dari format sumber:
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")Langkah 5: Verifikasi Output
Setelah menyimpan, pastikan file output ada dan memiliki ukuran tidak nol. Untuk pemeriksaan yang lebih menyeluruh, muat ulang dan bandingkan jumlah mesh:
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")Masalah Umum dan Solusi
File output dibuat tetapi tidak berisi geometri
File sumber mungkin telah dimuat dengan nol mesh. Tambahkan langkah inspeksi dari Langkah 3 sebelum menyimpan. Juga pastikan bahwa ekstensi file cocok dengan format sebenarnya; Aspose.3D menggunakan ekstensi untuk memilih parser.
output glTF tidak memiliki tekstur
Aspose.3D FOSS membawa geometri dan properti material melalui konversi. Jika OBJ sumber merujuk ke file gambar eksternal dalam .mtl, file gambar tersebut tidak secara otomatis disalin bersama .gltf. Salin gambar tekstur ke direktori output secara manual setelah menyimpan.
Output STL terlihat terbalik (normal permukaan terbalik)
STL tidak membawa metadata urutan winding. Jika normal output terbalik, atur opsi StlSaveOptions jika tersedia, atau balikkan sistem koordinat saat memuat: ObjLoadOptions.flip_coordinate_system = True.
ValueError: unsupported format saat menyimpan
Periksa apakah ekstensi file output adalah salah satu dari .obj, .stl, .gltf, .glb, .dae, .3mf. Ekstensi bersifat case-sensitive pada Linux.
Berkas sangat besar menyebabkan konversi lambat
Aspose.3D FOSS memproses geometri di memori. Untuk file dengan jutaan poligon, pastikan RAM yang cukup. Saat ini tidak ada API penulisan streaming.
Pertanyaan yang Sering Diajukan (FAQ)
Apakah saya dapat mengonversi file tanpa menulisnya ke disk terlebih dahulu?
Ya. Baik scene.open() maupun scene.save() menerima objek mirip file biner selain jalur file. Berikan objek apa pun yang mengimplementasikan read() untuk memuat atau write() untuk menyimpan:
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)Apakah FBX didukung sebagai format sumber untuk konversi?
Tokenisasi FBX sebagian diimplementasikan, tetapi parser belum lengkap. Input FBX dapat menghasilkan adegan yang tidak lengkap. Gunakan OBJ, STL, glTF, COLLADA, atau 3MF sebagai format sumber yang dapat diandalkan.
Apakah material akan bertahan dalam konversi OBJ ke glTF?
Properti material Phong/Lambert dasar (warna difus) dibawa melalui model Scene dan ditulis ke dalam blok material glTF. Parameter shader prosedural atau kustom yang tidak dapat diekspresikan dalam model material glTF akan diabaikan.
Bisakah saya mengonversi beberapa file dalam loop?
Ya. Setiap panggilan Scene.from_file() membuat objek independen, jadi loop pada daftar jalur menjadi sederhana:
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}")Apakah konversi mempertahankan hierarki adegan (node induk/anak)?
Ya. Pohon node dipertahankan sejauh format target memungkinkan. Format seperti STL hanya menyimpan geometri datar tanpa struktur node; hierarki diratakan saat disimpan. Format seperti glTF dan COLLADA mempertahankan hierarki penuh.