Jak zoptymalizować modele 3D w Python

Jak zoptymalizować modele 3D w Python

Problem

Duże pliki modeli 3D mogą wolno się ładować i przesyłać. Pracując z Aspose.3D w Python, możesz podjąć praktyczne kroki, aby zmniejszyć rozmiar pliku i usunąć niepotrzebne dane sceny; przede wszystkim poprzez eksport do kompaktowego formatu binarnego oraz usuwanie nieużywanych węzłów z grafu sceny.

Wymagania wstępne

  • Python 3.7 lub nowszy
  • aspose-3d-foss pakiet zainstalowany za pomocą pip install aspose-3d-foss
  • Plik wejściowy 3D (OBJ, STL, FBX, glTF lub 3MF)

Techniki optymalizacji

Konwertuj do zwartego formatu binarnego

Jednym z najskuteczniejszych sposobów zmniejszenia rozmiaru pliku jest eksport sceny do binarnego glTF (.glb). Format GLB pakuje geometrię i materiały w jeden plik binarny, który jest znacznie mniejszy i szybszy w ładowaniu niż formaty oparte na tekście, takie jak OBJ lub ASCII FBX.

from aspose.threed import Scene, FileFormat

scene = Scene.from_file("model.obj")
scene.save("model.glb", FileFormat.GLTF2_BINARY)

Sprawdź i zlicz siatki

Przed przetwarzaniem przydatne jest zrozumienie, ile węzłów siatek zawiera scena. Pomaga to zidentyfikować nieoczekiwanie duże lub złożone sceny.

from aspose.threed import Scene
from aspose.threed.entities import Mesh

scene = Scene.from_file("model.obj")

mesh_count = 0
for node in scene.root_node.child_nodes:
    if isinstance(node.entity, Mesh):
        mesh_count += 1
        print(f"  Mesh '{node.name}': {len(node.entity.control_points)} vertices, "
              f"{node.entity.polygon_count} polygons")

print(f"Total meshes: {mesh_count}")

Usuń nieużywane (wykluczone) węzły

Węzły oznaczone jako wykluczone nie są renderowane. Identyfikowanie i pomijanie tych węzłów podczas eksportu zmniejsza rozmiar sceny. The excluded atrybut jest właściwością w Entity, a nie wywołanie metody.

from aspose.threed import Scene
from aspose.threed.entities import Mesh

scene = Scene.from_file("model.obj")

active_nodes = []
for node in scene.root_node.child_nodes:
    entity = node.entity
    if entity is not None and not entity.excluded:
        active_nodes.append(node.name)

print(f"Active (non-excluded) nodes: {active_nodes}")

Przykład kodu

Ten przykład ładuje scenę, raportuje statystyki siatki i zapisuje do kompaktowego formatu GLB: główna praktyczna optymalizacja dostępna w Aspose.3D.

from aspose.threed import Scene, FileFormat
from aspose.threed.entities import Mesh

# Load the input model
scene = Scene.from_file("input.obj")

# Inspect mesh count and vertex totals
total_vertices = 0
for node in scene.root_node.child_nodes:
    if isinstance(node.entity, Mesh):
        mesh = node.entity
        total_vertices += len(mesh.control_points)

print(f"Total vertices before export: {total_vertices}")

# Save to compact binary GLB: smaller and faster to load than OBJ
scene.save("output.glb", FileFormat.GLTF2_BINARY)
print("Saved as GLB (binary glTF)")

Uwagi dotyczące zakresu optymalizacji

Aspose.3D nie zapewnia algorytmów decymacji siatek ani redukcji wielokątów. Redukcja rozmiaru pliku osiągana jest głównie poprzez:

  • Eksportowanie do formatów binarnych (GLB zamiast OBJ lub ASCII FBX)
  • Pomijanie wykluczonych lub pustych węzłów w ramach własnej logiki przetwarzania

Twierdzenia o konkretnych procentowych przyspieszeniach lub redukcjach pamięci zależą od danych wejściowych i nie mogą być ogólnie gwarantowane.

Zobacz także

 Polski