Jak uložit 3D scény v Pythonu

Jak uložit 3D scény v Pythonu

Aspose.3D FOSS pro Python umožňuje uložit Scene do jakéhokoli podporovaného výstupního formátu jediným voláním Scene.save(). Detekce formátu je automatická, když předáte cestu k souboru; pro pokročilé možnosti, jako je binární výstup nebo vkládání textur, poskytnete objekt možností ukládání specifický pro daný formát.

Průvodce krok za krokem

Krok 1: Instalace balíčku

Nainstalujte Aspose.3D FOSS z PyPI. Nevyžadují se žádné nativní knihovny.

pip install aspose-3d-foss

Podporované verze Pythonu: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Krok 2: Import požadovaných tříd

Minimálně potřebujete Scene. Importujte exportér specifický pro formát nebo třídu save-options pouze tehdy, když potřebujete nestandardní chování.

from aspose.threed import Scene

Pro možnosti specifické pro formát:

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

Krok 3: Načtení scény

Načtěte existující scénu z disku pomocí Scene.from_file(). Knihovna automaticky detekuje zdrojový formát z přípony souboru. Pokud chcete místo toho vytvořit scénu od začátku, viz Jak sestavit mesh v Pythonu.

# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")

Případně otevřete scénu s explicitními možnostmi pomocí Scene.open():

from aspose.threed import Scene

scene = Scene()
scene.open("input.fbx")

Krok 4: Uložení do STL

Zavolejte Scene.save() s cestou .stl. Ve výchozím nastavení je výstup ASCII STL. Chcete-li zapsat binární STL (menší soubor, bez čitelné hlavičky), použijte 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)

Krok 5: Uložení do glTF nebo GLB

Soubory GLTF 2.0 lze exportovat pomocí GltfExporter a GltfSaveOptions. Nastavte binary_mode = True pro vytvoření samostatného binárního balíčku .glb; nastavte binary_mode = False pro formát .gltf založený na 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())

Krok 6: Uložení do FBX

Scény FBX se exportují prostřednictvím FbxExporter. Použijte FbxSaveOptions pro povolení komprese nebo vložení textur do výstupního souboru.

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)

Krok 7: Uložení do OBJ nebo Collada (DAE)

Pro OBJ a Collada předejte cestu k souboru přímo do Scene.save(). Knihovna detekuje formát z přípony.

# 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)

Běžné problémy a řešení

Prázdný výstupní soubor po scene.save() To obvykle znamená, že kořenový uzel scény nemá žádné podřízené uzly s geometrií. Ověřte, že každý uzel sítě byl připojen k scene.root_node před voláním save. Zkontrolujte len(scene.root_node.child_nodes) po sestavení scény.

AttributeError při vytváření geometrie sítě Třída Mesh ukládá vrcholy jako interní seznam kontrolních bodů. Pro podrobné vzory konstrukce sítě viz článek Jak sestavit mesh v Pythonu, který pokrývá vytváření polygonů, prvky vrcholů a UV data.

GLB výstup je větší než očekáváno Binární GLB vkládá všechna data geometrie a textur. Pokud je GltfSaveOptions.flip_tex_coord_v nastaveno na True, je zahrnutý extra průchod pro překlopení souřadnic. Nastavte ho na False, pokud nepotřebujete překlopení textury podél osy V.

FBX import/export round-trip ztrácí materiály Export materiálů FBX je řízen pomocí FbxSaveOptions.export_legacy_material_properties. Nastavte toto na True, aby se zapisovaly standardní bloky materiálů FBX, které mohou číst nástroje třetích stran.

Collada DAE neobsahuje materiály Nastavte ColladaSaveOptions.enable_materials = True (výchozí hodnota je False) před exportem.

Nejčastější dotazy

Jaké formáty může Aspose.3D FOSS pro Python exportovat?

Knihovna podporuje export do: STL, glTF 2.0 (text a binární GLB), FBX, OBJ, Collada (DAE) a 3MF. Detekce formátu je automatická, když předáte řetězec cesty k souboru do Scene.save(); knihovna čte příponu a vybere správný exportér.

Existuje API pro streamovaný export, které se vyhýbá zápisu na disk?

Ano. GltfExporter.export(scene, stream, options) zapisuje do libovolného io.BytesIO nebo objektu podobného souboru. Paměťový buffer můžete předat přímo webové odpovědi nebo dalšímu zpracování bez dotyku souborového systému.

Jak mohu převést scénu z jednoho formátu do jiného?

Načtěte scénu pomocí Scene.from_file("input.fbx") a uložte pomocí scene.save("output.gltf"). Knihovna zpracovává konverzi v paměti; nejsou potřeba žádné mezilehlé soubory.

Mohu uložit více podscén do samostatných souborů?

Přistupte k scene.sub_scenes pro iteraci přes každou podscénu, vytvořte nový objekt Scene, připojte příslušné uzly a zavolejte save() na každém.

Přepíše Scene.save() existující soubory tiše?

Ano. Knihovna nevyvolá chybu, pokud cílový soubor již existuje; přepíše ho. Přidejte do kódu kontrolu existence souboru, pokud potřebujete chránit před nechtěným přepsáním.

Viz také

 Čeština