Як зберегти 3D сцени у Python
Aspose.3D FOSS for 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. Імпортуйте експортера, специфічного для формату, або клас параметрів збереження лише коли вам потрібна нестандартна поведінка.
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 зберігає вершини у внутрішньому списку контрольних точок. Для докладних шаблонів побудови сітки зверніться до статті How to Build a Mesh in Python, яка охоплює створення полігонів, елементи вершин та дані UV.
Вихідний файл GLB більший, ніж очікувалося
Бінарний GLB вбудовує всі дані геометрії та текстур. Якщо GltfSaveOptions.flip_tex_coord_v встановлено в True, включається додатковий прохід перевертання координат. Встановіть його в False, якщо вам не потрібне перевертання текстур по осі V.
FBX import/export round-trip loses materials
Експорт матеріалів 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() перезаписує існуючі файли без повідомлення?
Так. Бібліотека не генерує помилку, якщо цільовий файл вже існує; вона перезаписує його. Додайте перевірку існування файлу у вашому коді, якщо потрібно захиститися від випадкових перезаписів.