Як оптимізувати 3D‑моделі в Python

Як оптимізувати 3D‑моделі в Python

Проблема

Великі файли 3D‑моделей можуть повільно завантажуватись і передаватись. Працюючи з Aspose.3D у Python, ви можете виконати практичні кроки для зменшення розміру файлу та видалення непотрібних даних сцени; головним чином шляхом експорту у компактний бінарний формат та обрізання невикористаних вузлів графа сцени.

Вимоги

  • Python 3.7 або новіше
  • aspose-3d-foss пакет встановлено за допомогою pip install aspose-3d-foss
  • Вхідний 3D‑файл (OBJ, STL, FBX, glTF або 3MF)

Техніки оптимізації

Перетворити у компактний бінарний формат

Один із найефективніших способів зменшити розмір файлу — експортувати сцену у двійковий glTF (.glb). Формат GLB упакує геометрію та матеріали в один двійковий файл, який значно менший і швидший у завантаженні, ніж текстові формати, такі як OBJ або ASCII FBX.

from aspose.threed import Scene, FileFormat

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

Перевірка та підрахунок мешів

Перед обробкою корисно зрозуміти, скільки вузлів мешів містить сцена. Це допомагає виявити несподівано великі або складні сцени.

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

Видалити невикористані (виключені) вузли

Вузли, позначені як виключені, не відображаються. Визначення та пропуск цих вузлів під час експорту зменшує розмір сцени. The excluded attribute є властивістю Entity, а не виклик методу.

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

Приклад коду

Цей приклад завантажує сцену, повідомляє статистику сітки та зберігає у компактному форматі GLB: головна практична оптимізація, доступна через 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)")

Примітки щодо області оптимізації

Aspose.3D не забезпечує алгоритми зменшення сітки або скорочення полігонів. Зменшення розміру файлу досягається в основному за рахунок:

  • Експортування у бінарні формати (GLB замість OBJ або ASCII FBX)
  • Пропуск виключених або порожніх вузлів під час вашої власної логіки обробки

Твердження про конкретні відсоткові прискорення або зменшення використання пам’яті залежать від ваших вхідних даних і не можуть бути гарантовані загалом.

Дивіться також

 Українська