Как сохранять 3D-сцены в Python

Как сохранять 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() существующие файлы без предупреждения?

Да. Библиотека не генерирует ошибку, если целевой файл уже существует; она перезаписывает его. Добавьте проверку существования файла в свой код, если вам нужна защита от случайной перезаписи.

См. также

 Русский