Jak zaoszczędzić 3D sceny w Pythonie
Aspose.3D FOSS dla Pythona pozwala zaoszczędzić Scene do dowolnego obsługiwanego formatu wyjścia za pomocą jednego Scene.save() Detekcja formatu jest automatyczna, gdy przechodzisz drogę pliku; dla zaawansowanych opcji takich jak wyjście binarne lub tekstura wbudowy, dostarczasz obiekt opcje zapasów określonych w formacie.
Przewodnik krok po kroku
Krok 1: Instalacja pakietu
Instaluj Aspose.3D FOSS z PyPI. Nie wymagane są biblioteki domowe.
pip install aspose-3d-fossWspierane wersje Pythona: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Krok 2: Import wymaganych klas
W minimalnym stopniu potrzebne jest Scene.Import klasy eksporterów lub opcji zapasowych tylko wtedy, gdy potrzebujesz niepodstawowego zachowania.
from aspose.threed import SceneDla opcji specyficznych formatów:
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: Pobierz scenę
Pobierz istniejącą scenę z dysku za pomocą Scene.from_file().Biblioteka automatycznie wykrywa format źródłowy z rozszerzenia pliku. Aby zbudować scenę z skraju zamiast, zobacz Jak zbudować mesh w Pythonie.
# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")Alternatywnie, otwórz scenę z wyraźnymi opcjami poprzez Scene.open():
from aspose.threed import Scene
scene = Scene()
scene.open("input.fbx")Krok 4: Zostaw na STL
Wzywaj Scene.save() z A .stl Podstawowym wyjściem jest ASCII STL. Aby napisać binary STl (mały plik, nie można czytać ludzkiego tytułu) użycie 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: Uszczędzaj na GLTF lub GLB
Pliki GLTF 2.0 można eksportować za pomocą GltfExporter i GltfSaveOptions.Zestaw binary_mode = True Aby stworzyć samodzielnie zawierane .glb Binarny zestaw; set binary_mode = False dla JSON-Based .gltf w formacie .
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: Zapisz na FBX
Nie wdrożone:
FbxExporter.save()iFbxExporter.save_to_stream()WzrostNotImplementedErrorFBX eksportowanie nie jest dostępne w Aspose.3D FOSS dla Python na tym etapie.Zamiast tego użyj formatu GLB, OBJ, STL lub Collada (DAE). zobacz kroki 4, 5 i 7 dla opcji eksportu.
# The following code raises NotImplementedError in the current release:
# from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions
# exporter = FbxExporter()
# exporter.save(scene, "output.fbx", options) # raises NotImplementedError
# Use a supported format instead:
scene.save("output.glb") # binary GLB — recommended
scene.save("output.obj") # Wavefront OBJ
scene.save("output.stl") # STLKrok 7: Zapisz na OBJ lub Collada (DAE)
W przypadku OBJ i Collada, przejdź drogę pliku bezpośrednio do Scene.save().Biblioteka wykrywa format z 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)Wspólne problemy i rozwiązania
Puste pliki po wyjściu scene.save() To zazwyczaj oznacza, że węzły korzeniowe sceny nie mają wąska z geometry. sprawdź, czy każdy węgla jest przymocowany do scene.root_node Przed wezwaniem save.Sprawdź len(scene.root_node.child_nodes) Po budowie sceny.
AttributeError Kiedy budować geometrii mesh i The Mesh klasowe magazyny pionowe jako wewnętrzny listę punktów kontrolnych. dla szczegółowych wzorców budowy mesz, odwołuj się do Jak zbudować mesh w Pythonie Artykuł, który obejmuje tworzenie poligonu, elementy pionowe i dane UV.
Produkcja GLB jest większa niż oczekiwano. Binary GLB zawiera wszystkie dane geometryczne i teksturowe. GltfSaveOptions.flip_tex_coord_v Został ustawiony na True, dodatkowy paszport koordynat-flip jest włączony. ustawić go do False Jeśli nie potrzebujesz tekstury V-axis.
Eksport FBX nie jest dostępny w bieżącym wydaniu FbxExporter.save() Wzrost NotImplementedError.Wprowadzenie do FBX (zładowanie) .fbx pliki) działa normalnie, ale eksportowanie do FBX nie jest wdrożone. Konwertować na GLB, OBJ, STL lub Collada zamiast tego.
Collada DAE nie zawiera materiałów Zestaw ColladaSaveOptions.enable_materials = True (to jest False przed wywozem (w przypadku niewypłacalności).
Często zadawane pytania
Jakie formaty mogą Aspose.3D FOSS dla eksportu Pythona?
Biblioteka obsługuje eksportowanie do: STL, glTF 2.0 (text i binary GLB), OBJ i Collada (DAE). Scene.save();Biblioteka czyta rozszerzenie, aby wybrać właściwego eksportera.
Uwaga:Eksport FBX jest niewykonane W obecnym wydaniu -
FbxExporter.save()WzrostNotImplementedError.Zamiast tego użyj GLB, OBJ, STL lub Collada.
Czy istnieje API eksportu transmisji, która unika pisania na dyski?
Tak i tak. GltfExporter.export(scene, stream, options) Pisz do każdego io.BytesIO lub obiekt podobny do pliku. można przekazać buffer pamięci bezpośrednio na odpowiedź internetową lub dalsze przetwarzanie bez dotknięcia systemu plików.
Jak mogę przekonwertować scenę z jednego formatu do drugiego?
Wypełnij scenę z Scene.from_file("input.fbx") i oszczędzać z scene.save("output.gltf").Biblioteka obsługuje konwersję pamięci; nie potrzebne są pliki pośrednie.
Czy mogę zapisać kilka podskoków do oddzielnych plików?
Dostęp scene.sub_scenes aby zdradzić na każdym podskrzynku, tworzyć nowy Scene obiekt, przyklejać odpowiednie węzły i zadzwonić save() Na każdym z nich.
Czyli Scene.save() Czy można przepisać istniejące pliki w ciszy?
Tak. Biblioteka nie powoduje błędu, jeśli plik docelowy istnieje; nadpisuje go. Dodaj kontrolę istnienia pliku do kodu, jeżeli musisz chronić przed przypadkowymi nadpisemami.