Как оптимизировать 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 атрибут — это свойство на 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)
  • Пропуск исключённых или пустых узлов в вашей собственной логике обработки

Утверждения о конкретных процентных ускорениях или сокращении памяти зависят от ваших входных данных и не могут быть гарантированы в общем случае.

См. также

 Русский