Jak zaoszczędzić 3D sceny w Pythonie

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-foss

Wspierane 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 Scene

Dla 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, ColladaSaveOptions

Krok 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() i FbxExporter.save_to_stream() Wzrost NotImplementedError FBX 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")   # STL

Krok 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() Wzrost NotImplementedError.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.

Zobacz również

 Polski