夜風のMixedReality

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

Blenderでマテリアル数をビューポートに表示する

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

Blenderではポリゴン数等は表示できますが、マテリアル数はマテリアルスロットを表示する必要があるため今回可視化できないか挑戦してきます。

〇マテリアル数の取得と表示

マテリアル数を取得するためにはobj.data.materialsを使用します。

具体的に現在選択しているオブジェクトのマテリアルを出力するコードは以下になります。

import bpy

selected_objects = bpy.context.selected_objects
total_materials = sum(len(obj.data.materials) for obj in selected_objects if obj.type == 'MESH')

print("Total number of materials in selected objects: ", total_materials)

このスクリプトを実行することでシーン上で選択しているオブジェクトの持つマテリアル数が表示できます。

具体的にはobj.data.materialsでオブジェクトのマテリアルの配列にアクセスし、len関数で配列の大きさを取得しています。

〇Blenderで情報をビューポートにテキストとして表示する。

次にコンソールではなくビューポートに情報を表示させるようにしていきます。

以下のコードで実現することができます。

import bpy
import blf

def draw_callback_px(self, context):
    font_id = 0  # default font

    # draw some text
    blf.position(font_id, 15, 30, 0)
    blf.size(font_id, 20, 72)
    
    if context.object is not None:
        blf.draw(font_id, "Object: " + context.object.name)
    else:
        blf.draw(font_id, "No object selected")

bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, (None, bpy.context), 'WINDOW', 'POST_PIXEL')

こちらのコードではBlenderで提供されているAPIのFont Drawingを使用しています。

docs.blender.org

このモジュールはBlenderのテキスト描画機能を使用することができます。

bpy.types.SpaceView3D.draw_handler_addによって3Dビューポートに描画するように記述しています。

このコードを実行すると次のようにビューポートの下部に選択しているオブジェクト名が表示されます。

〇選択しているオブジェクトのマテリアル数をビューポートに表示する

上記二つのコードを混ぜると次のようになります。

import bpy
import blf

def draw_callback_px(self, context):
    font_id = 0  # default font

    # draw some text
    blf.position(font_id, 15, 30, 0)
    blf.size(font_id, 20, 72)
    
    if context.object is not None:
       
        
        # Check if the object has materials
        if context.object.data.materials:
            blf.position(font_id, 15, 60, 0)
            blf.draw(font_id, "Total Materials: " + str(len(context.object.data.materials)))
        else:
            blf.position(font_id, 15, 60, 0)
            blf.draw(font_id, "No Materials")
    else:
        blf.draw(font_id, "No object selected")

bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, (None, bpy.context), 'WINDOW', 'POST_PIXEL')

こちらを実行することで現在選択しているオブジェクトの持つマテリアル数が表示されます。

以上でマテリアル数をビューポートに表示できました。

情報をビューポートに描画するテクニックは非常に今後使えそうなのでいろいろ試していきたいと思います。

本日は以上です。