Jak zapisywać sceny 3D w Pythonie
Aspose.3D FOSS dla Pythona umożliwia zapisanie Scene do dowolnego obsługiwanego formatu wyjściowego przy użyciu jednego wywołania Scene.save(). Wykrywanie formatu odbywa się automatycznie, gdy przekazujesz ścieżkę do pliku; dla zaawansowanych opcji, takich jak dane wyjściowe binarne lub osadzanie tekstur, podajesz obiekt opcji zapisu specyficzny dla formatu.
Przewodnik krok po kroku
Krok 1: Instalacja pakietu
Zainstaluj Aspose.3D FOSS z PyPI. Nie są wymagane żadne natywne biblioteki.
pip install aspose-3d-fossObsługiwane wersje Pythona: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Krok 2: Import wymaganych klas
Potrzebujesz co najmniej Scene. Importuj eksporter specyficzny dla formatu lub klasę save-options tylko wtedy, gdy potrzebujesz niestandardowego zachowania.
from aspose.threed import SceneDla opcji specyficznych dla formatu:
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, ColladaSaveOptionsKrok 3: Wczytanie sceny
Wczytaj istniejącą scenę z dysku za pomocą Scene.from_file(). Biblioteka automatycznie wykrywa format źródłowy na podstawie rozszerzenia pliku. Aby zamiast tego zbudować scenę od podstaw, zapoznaj się z artykułem Jak zbudować siatkę w Pythonie.
# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")Ewentualnie otwórz scenę z jawnymi opcjami za pomocą Scene.open():
from aspose.threed import Scene
scene = Scene()
scene.open("input.fbx")Krok 4: Zapisanie do STL
Wywołaj Scene.save() ze ścieżką .stl. Domyślnie dane wyjściowe to ASCII STL. Aby zapisać binarny STL (mniejszy plik, bez czytelnego nagłówka), użyj 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: Zapisanie do glTF lub GLB
Pliki GLTF 2.0 można eksportować za pomocą GltfExporter i GltfSaveOptions. Ustaw binary_mode = True, aby wygenerować samodzielny pakiet binarny .glb; ustaw binary_mode = False dla formatu .gltf opartego 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: Zapisanie do FBX
Sceny FBX są eksportowane za pomocą FbxExporter. Użyj FbxSaveOptions, aby włączyć kompresję lub osadzić tekstury w pliku wyjściowym.
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: Zapisanie do OBJ lub Collada (DAE)
W przypadku OBJ i Collada przekaż ścieżkę pliku bezpośrednio do Scene.save(). Biblioteka wykrywa format na podstawie rozszerzenia.
# 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)Typowe problemy i rozwiązania
Pusty plik wyjściowy po scene.save()
Zwykle oznacza to, że węzeł główny sceny nie ma węzłów podrzędnych z geometrią. Sprawdź, czy każdy węzeł siatki został dołączony do scene.root_node przed wywołaniem save. Sprawdź len(scene.root_node.child_nodes) po zbudowaniu sceny.
AttributeError podczas budowania geometrii siatki
Klasa Mesh przechowuje wierzchołki jako wewnętrzną listę punktów kontrolnych. Szczegółowe wzorce konstruowania siatek znajdziesz w artykule Jak zbudować siatkę w Pythonie, który obejmuje tworzenie wielokątów, elementy wierzchołków i dane UV.
Dane wyjściowe GLB są większe niż oczekiwano
Binarny GLB osadza wszystkie dane geometrii i tekstur. Jeśli GltfSaveOptions.flip_tex_coord_v jest ustawione na True, dołączany jest dodatkowy przebieg odwracania współrzędnych. Ustaw je na False, jeśli nie potrzebujesz odwracania tekstury wzdłuż osi V.
Pętla importu/eksportu FBX traci materiały
Eksport materiałów FBX jest kontrolowany przez FbxSaveOptions.export_legacy_material_properties. Ustaw to na True, aby zapisywać standardowe bloki materiałów FBX, które mogą odczytywać narzędzia firm zewnętrznych.
Collada DAE nie zawiera materiałów
Ustaw ColladaSaveOptions.enable_materials = True (domyślnie False) przed eksportem.
Często zadawane pytania
Jakie formaty może eksportować Aspose.3D FOSS dla Pythona?
Biblioteka obsługuje eksport do: STL, glTF 2.0 (tekst i binarny GLB), FBX, OBJ, Collada (DAE) i 3MF. Wykrywanie formatu odbywa się automatycznie, gdy przekazujesz ciąg ścieżki pliku do Scene.save(); biblioteka odczytuje rozszerzenie, aby wybrać właściwy eksporter.
Czy istnieje strumieniowe API eksportu, które unika zapisu na dysk?
Tak. GltfExporter.export(scene, stream, options) zapisuje do dowolnego io.BytesIO lub obiektu podobnego do pliku. Możesz przekazać bufor w pamięci bezpośrednio do odpowiedzi sieciowej lub dalszego przetwarzania bez dotykania systemu plików.
Jak przekonwertować scenę z jednego formatu na inny?
Wczytaj scenę za pomocą Scene.from_file("input.fbx") i zapisz za pomocą scene.save("output.gltf"). Biblioteka obsługuje konwersję w pamięci; nie są potrzebne żadne pliki pośrednie.
Czy mogę zapisać wiele podscen do osobnych plików?
Uzyskaj dostęp do scene.sub_scenes, aby iterować po każdej podscenie, utwórz nowy obiekt Scene, dołącz odpowiednie węzły i wywołaj save() na każdym.
Czy Scene.save() nadpisuje istniejące pliki w sposób cichy?
Tak. Biblioteka nie zgłasza błędu, jeśli plik docelowy już istnieje; nadpisuje go. Dodaj sprawdzenie istnienia pliku w swoim kodzie, jeśli potrzebujesz ochrony przed przypadkowym nadpisaniem.