Python で 3D モデルを最適化する方法

Python で 3D モデルを最適化する方法

問題

大きな 3D モデルファイルは読み込みや転送に時間がかかることがあります。Python で Aspose.3D を扱う際、ファイルサイズを削減し不要なシーンデータを除去する実用的な手順があります。主に、コンパクトなバイナリ形式へエクスポートし、シーングラフから未使用ノードを削除することで実現できます。.

前提条件

  • 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 はメッシュのデシメーションやポリゴン削減アルゴリズムを提供しません。ファイルサイズの削減は主に以下によって実現されます::

  • バイナリ形式へのエクスポート(OBJ や ASCII FBX の代わりに GLB)
  • 独自の処理ロジックで除外されたノードや空のノードをスキップする

特定のパーセンテージの速度向上やメモリ削減に関する主張は、入力データに依存し、一般的に保証できません。.

参照

 日本語