Kaip optimizuoti 3D modelius Python
Problema
Dideli 3D modelio failai gali būti lėti įkelti ir perkelti. Dirbant su Aspose.3D Python, yra praktinių žingsnių, kuriuos galite atlikti, kad sumažintumėte failo dydį ir pašalintumėte nereikalingus scenos duomenis; pagrindinė priemonė – eksportuoti į kompaktišką binarinį formatą ir išvalyti nenaudojamus mazgus iš scenos grafiko.
Būtinosios sąlygos
- Python 3.7 arba naujesnė
aspose-3d-fosspaketas įdiegtas perpip install aspose-3d-foss- 3D įvesties failas (OBJ, STL, FBX, glTF arba 3MF)
Optimizavimo technikos
Konvertuokite į kompaktišką binarinį formatą
Vienas efektyviausių būdų sumažinti failo dydį – eksportuoti sceną į glTF binarinį (.glb). GLB formatas supakuoja geometriją ir medžiagas į vieną binarinį failą, kuris yra žymiai mažesnis ir greitesnis įkelti nei tekstiniai formatai, tokie kaip OBJ arba ASCII FBX.
from aspose.threed import Scene
scene = Scene.from_file("model.obj")
# Use the .glb extension for binary GLB auto-detection
# Note: FileFormat.GLTF2_BINARY is a None stub — do not pass it to scene.save()
scene.save("model.glb")Patikrinkite ir suskaičiuokite tinklus
Prieš apdorojimą naudinga suprasti, kiek tinklo mazgų scena turi. Tai padeda identifikuoti netikėtai dideles arba sudėtingas scenas.
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}")Pašalinkite nenaudojamus (išskirtus) mazgus
Mazgo žymėti mazgai nėra atvaizduojami. Identifikavimas ir šių mazgų praleidimas eksporto metu sumažina scenos pėdsaką. Ši excluded atributas yra savybė, priklausanti Entity, o ne metodo iškvietimas.
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}")Kodo pavyzdys
Šiame pavyzdyje įkeliamas scena, pateikiama tinklų statistika ir išsaugoma į kompaktišką GLB formatą: pagrindinė praktinė optimizacija, prieinama per Aspose.3D.
from aspose.threed import Scene
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 — use .glb extension for auto-detection
# Note: FileFormat.GLTF2_BINARY is a None stub and must not be passed to scene.save()
scene.save("output.glb")
print("Saved as GLB (binary glTF)")Pastabos apie optimizacijos apimtį
Aspose.3D nepateikia tinklų supaprastinimo ar daugiakampių sumažinimo algoritmų. Failo dydžio sumažinimas pasiekiamas pagrindinai per:
- Eksportavimą į binarinius formatus (GLB vietoj OBJ arba ASCII FBX)
- Išskirtų arba tuščių mazgų praleidimą jūsų pačių apdorojimo logikoje
Teiginiai apie konkrečius procentinius pagreitėjimus ar atminties sumažinimus priklauso nuo jūsų įvesties duomenų ir negali būti garantuoti apskritai.