夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Blenderでポリゴン数が多い順にオブジェクトを表示する

本日はBlenderモデリング枠です。

Blenderでは3Dビューポートのビューポートオーバーレイから統計にチェックを入れて有効化することで3Dビューポートにポリゴン数を表示することができます。

 しかしここで表示されるポリゴン数はシーン上に表示されているすべてのポリゴン数もしくは現在選択しているオブジェクトのポリゴン数になります。

 今回はPythonを使用してBlenderでオブジェクトごとにポリゴン数を表示させ、ポリゴン数が多い順にソート(並べて表示)する機能を作っていきます。

今回はBlender3.4を使用します。

〇現在選択しているオブジェクトの取得

現在選択しているオブジェクトを取得するコードは以下です。

import bpy

# 選択したオブジェクトを取得
selected_objects = bpy.context.selected_objects

import bpyはPythonのBlenderライブラリを使用することを定義しています。

bpy.contextはBlenderの情報を取得するクラスです。selected_objectsを使用することでBlenderのビューポートで現在選択しているオブジェクトを取得できます。

〇オブジェクトごとにポリゴン数を取得

ポリゴン数を取得するコードは以下になります。

# ポリゴン数とオブジェクトを格納するリストを初期化
poly_counts = []

for obj in selected_objects:
    # オブジェクトがメッシュであることを確認
    if obj.type == 'MESH':
        # ポリゴン数を計算
        poly_count = len(obj.data.polygons)
        # ポリゴン数とオブジェクトの名前をリストに追加
        poly_counts.append((poly_count, obj.name))

poly_countsという配列を作成し、selected_objectsで格納されているデータ文for文でループ処理を行っています。

selected_objectsに格納されているデータにはアーマーチュアなどメッシュではないものもあるためメッシュのみ処理を行い、len(obj.data.polygons)でオブジェクトのそうポリゴン数を取得しています。

最後に今回の場合ポリゴン数が多いオブジェクトを表示したいのでポリゴン数とオブジェクト名をリストに格納しています。

 poly_counts.append((poly_count, obj.name))

〇ソートと表示

今回はとりあえずコンソールウィンドウに結果を表示していきます。

コンソールウィンドウとはBlender3.4ではBlenderを起動した際に別ウィンドウで起動しているBlenderの情報が表示されるウィンドウです。

ポリゴン数をソートしてコンソールに表示するには以下のコードを使用します。

# ポリゴン数が多い順にソート
poly_counts.sort(reverse=True)

# 結果をコンソールに表示
for poly_count, obj_name in poly_counts:
    print(f'Object: {obj_name}, Polygons: {poly_count}')

poly_countsはリストです。 sortメソッドを使用することで小さい順に並べ替えてくれます。ただし今回はポリゴン数が大きい順で並べ替えてほしいため引数にreverse=Trueを渡して逆にしています。

これによってポリゴン数が多い順に並べ替えられたpoly_countsをfor文を使用してprint()でコンソールにログを出力しています。

実行結果は次のようになります。

これでポリゴン数が多い順に表示することができました。

VRやMR開発ではポリゴン数の壁が常にあるため削減を行う必要があるシーンなどありますが、このようにポリゴン数順にソートすることによってどのオブジェクトがどのくらいポリゴン数を使用しているのかを可視化して、どのオブジェクトのポリゴン数を削減するのかをより判断しやすくなると思っています。

〇コード一覧

import bpy

# 選択したオブジェクトを取得
selected_objects = bpy.context.selected_objects

# ポリゴン数とオブジェクトを格納するリストを初期化
poly_counts = []

for obj in selected_objects:
    # オブジェクトがメッシュであることを確認
    if obj.type == 'MESH':
        # ポリゴン数を計算
        poly_count = len(obj.data.polygons)
        # ポリゴン数とオブジェクトの名前をリストに追加
        poly_counts.append((poly_count, obj.name))

# ポリゴン数が多い順にソート
poly_counts.sort(reverse=True)

# 結果をコンソールに表示
for poly_count, obj_name in poly_counts:
    print(f'Object: {obj_name}, Polygons: {poly_count}')