Как да запазите 3D сцени в Python
Aspose.3D FOSS за Python ви позволява да запазите Scene в произволен поддържан изходен формат с едно извикване на Scene.save(). Разпознаването на формата е автоматично, когато подадете пътя до файла; за разширени опции като двоичен изход или вграждане на текстури предоставяте обект с опции за записване, специфичен за формата.
Ръководство стъпка по стъпка
Стъпка 1: Инсталиране на пакета
Инсталирайте Aspose.3D FOSS от PyPI. Не са необходими нативни библиотеки.
pip install aspose-3d-fossПоддържани версии на Python: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Стъпка 2: Импортиране на необходимите класове
Минимално имате нужда от Scene. Импортирайте специфичния за формата износител или класа save-options само когато имате нужда от нестандартно поведение.
from aspose.threed import SceneЗа специфични за формата опции:
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, ColladaSaveOptionsСтъпка 3: Зареждане на сцена
Заредете съществуваща сцена от диска, използвайки Scene.from_file(). Библиотеката автоматично разпознава изходния формат от разширението на файла. За да изградите сцена от нулата, вижте Как да изградите меш в Python.
# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")Алтернативно, отворете сцена с явни опции чрез Scene.open():
from aspose.threed import Scene
scene = Scene()
scene.open("input.fbx")Стъпка 4: Записване в STL
Извикайте Scene.save() с път .stl. По подразбиране изходът е ASCII STL. За да запишете двоичен STL (по-малък файл, без четим от човека заглавен ред), използвайте 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)Стъпка 5: Записване в glTF или GLB
Файловете GLTF 2.0 могат да бъдат експортирани с помощта на GltfExporter и GltfSaveOptions. Задайте binary_mode = True за създаване на самодостатъчен двоичен пакет .glb; задайте binary_mode = False за формата .gltf на базата на 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())Стъпка 6: Записване в FBX
FBX сцените се експортират чрез FbxExporter. Използвайте FbxSaveOptions за активиране на компресия или вграждане на текстури в изходния файл.
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)Стъпка 7: Записване в OBJ или Collada (DAE)
За OBJ и Collada подайте пътя до файла директно на Scene.save(). Библиотеката разпознава формата от разширението.
# 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)Чести проблеми и решения
Празен изходен файл след scene.save()
Това обикновено означава, че основният възел на сцената няма дъщерни възли с геометрия. Проверете, че всеки мрежов възел е прикачен към scene.root_node преди извикване на save. Проверете len(scene.root_node.child_nodes) след изграждане на сцената.
AttributeError при изграждане на геометрия на мрежата
Класът Mesh съхранява върховете като вътрешен списък с контролни точки. За подробни шаблони за конструиране на мрежи вижте статията Как да изградите меш в Python, която обхваща създаването на многоъгълници, елементи на върхове и UV данни.
Изходът на GLB е по-голям от очакваното
Двоичният GLB вгражда всички данни за геометрия и текстури. Ако GltfSaveOptions.flip_tex_coord_v е зададено на True, се включва допълнителен преход на обръщане на координатите. Задайте го на False, ако не ви е необходимо обръщане на текстурата по оста V.
Цикълът на импортиране/експортиране на FBX губи материали
Експортирането на FBX материали се контролира от FbxSaveOptions.export_legacy_material_properties. Задайте това на True, за да запишете стандартни FBX блокове с материали, които инструменти на трети страни могат да четат.
Collada DAE не включва материали
Задайте ColladaSaveOptions.enable_materials = True (по подразбиране е False) преди експортиране.
Често задавани въпроси
Какви формати може да експортира Aspose.3D FOSS за Python?
Библиотеката поддържа експортиране към: STL, glTF 2.0 (текст и двоичен GLB), FBX, OBJ, Collada (DAE) и 3MF. Разпознаването на формата е автоматично, когато подадете низ с пътя до файла на Scene.save(); библиотеката чете разширението за избор на правилния износител.
Има ли поточен API за експортиране, който избягва записването на диск?
Да. GltfExporter.export(scene, stream, options) записва в произволен io.BytesIO или файлоподобен обект. Можете да подадете буфера в паметта директно на уеб отговор или за по-нататъшна обработка, без да докосвате файловата система.
Как да конвертирам сцена от един формат в друг?
Заредете сцената с Scene.from_file("input.fbx") и запазете с scene.save("output.gltf"). Библиотеката обработва конверсията в паметта; не са необходими междинни файлове.
Мога ли да запазя множество подсцени в отделни файлове?
Получете достъп до scene.sub_scenes, за да итерирате по всяка подсцена, създайте нов обект Scene, прикачете съответните възли и извикайте save() за всеки.
Презаписва ли Scene.save() съществуващи файлове без предупреждение?
Да. Библиотеката не генерира грешка, ако целевият файл вече съществува; тя го презаписва. Добавете проверка за съществуване на файл в кода си, ако трябва да се предпазите от случайно презаписване.