Как сохранять 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() существующие файлы без предупреждения?
Да. Библиотека не генерирует ошибку, если целевой файл уже существует; она перезаписывает его. Добавьте проверку существования файла в свой код, если вам нужна защита от случайной перезаписи.