Hur man optimerar 3D-modeller i Python

Hur man optimerar 3D-modeller i Python

Problem

Stora 3D-modellfiler kan vara långsamma att ladda och överföra. När du arbetar med Aspose.3D i Python finns det praktiska steg du kan ta för att minska filstorleken och ta bort onödig scendata; främst genom att exportera till ett kompakt binärt format och rensa bort oanvända noder från scengrafen.

Förutsättningar

  • Python 3.7 eller senare
  • aspose-3d-foss paket installerat via pip install aspose-3d-foss
  • En 3D-indatafil (OBJ, STL, FBX, glTF eller 3MF)

Optimeringstekniker

Konvertera till ett kompakt binärt format

Ett av de mest effektiva sätten att minska filstorleken är att exportera scenen till glTF-binär (.glb). GLB-formatet packar geometri och material i en enda binär fil, vilket är avsevärt mindre och snabbare att ladda än textbaserade format som OBJ eller ASCII FBX.

from aspose.threed import Scene, FileFormat

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

Inspektera och räkna meshar

Innan bearbetning är det bra att förstå hur många mesh‑noder scenen innehåller. Detta hjälper till att identifiera oväntat stora eller komplexa scener.

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}")

Ta bort oanvända (exkluderade) noder

Noder markerade som exkluderade renderas inte. Att identifiera och hoppa över dessa noder under export minskar scenens fotavtryck. Den excluded attributet är en egenskap på Entity, inte ett metodanrop.

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}")

Kodexempel

Det här exemplet laddar en scen, rapporterar mesh-statistik och sparar till det kompakta GLB-formatet: den huvudsakliga praktiska optimeringen som finns tillgänglig via 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)")

Anmärkningar om optimeringsomfång

Aspose.3D tillhandahåller inte mesh-dekimering eller polygonreduceringsalgoritmer. Filstorleksreduktion uppnås främst genom:

  • Export till binära format (GLB istället för OBJ eller ASCII FBX)
  • Hoppa över exkluderade eller tomma noder i din egen bearbetningslogik

Påståenden om specifika procentuella hastighetsökningar eller minskningar av minnesanvändning beror på dina indata och kan inte garanteras i allmänhet.

Se även

 Svenska