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

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

Вижте също

 Български