夜風のMixedReality

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

Blenderで選択されマテリアルが持つテクスチャ情報を取得する

本日は昨日に引き続きMixedRealityModelingTools枠です。

現在メッシュやマテリアルの色を送信することができているMixedRealityModelingToolsですが、バージョン1のリリースにテクスチャ情報を含ませたいためこれを行うためのシンプルなコードを記述していきます。

〇テクスチャ情報の取得 前提条件

Blenderのオブジェクトの中でテクスチャはマテリアルと紐づくシェーダーにTextureノードとして紐づいています。

一般的にベースカラー、ノーマルマップ、roughネスマップなど多くのテクスチャがマテリアルには紐づけられており、すべてを取得しようとなると複雑な処理になります。

今回は以下の条件であるマテリアルに対してテクスチャの情報を取得していきます。

プリンシパルBDSDシェーダーを使用している。

・シェーダー以外のノードはBaseColorに出力するテクスチャノードが一つだけある。

この条件はまずはシンプルなコードを理解する上でz邪魔となるノイズを削除する点で対戦つです。

〇テクスチャを取得する

まずは使用されているテクスチャ名を取得していきます。コードとしては次のようになります。

import bpy

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

# 選択中のオブジェクトごとにマテリアルを取得 複数のオブジェクトに対応する
for obj in selected_objects:
    if obj.type == 'MESH':  # 選択されたオブジェクトがメッシュオブジェクトの場合
        materials = obj.data.materials #マテリアルのリストを取得
        for material in materials:  #リストから一つ一つのマテリアルについて処理
            if material.use_nodes:  # ノードが使用されているかチェック
                nodes = material.node_tree.nodes#マテリアルに紐づくノードを取得
                for node in nodes:#ノードの数実行
                    if node.type == 'BSDF_PRINCIPLED':  # プリンシパルBSDFシェーダーノードを検索
                        base_color_socket = node.inputs["Base Color"]
                        if base_color_socket.is_linked:  # BaseColorにリンクがあるかチェック
                            texture_node = base_color_socket.links[0].from_node
                            if texture_node.type == 'TEX_IMAGE':  # テクスチャノードを検索
                                texture = texture_node.image
                                print(f"Object: {obj.name}, Material: {material.name}, Texture: {texture.name}")

これを実行することで、コンソールログにテクスチャ名を取得できます。

上記のコードではtexture_node_imageでテクスチャノードからテクスチャを取得しています。

重要な処理として今回使用した『BaseColorに接続しているテクスチャノード』という点ですが、is_linkedで検出しています。

                        if base_color_socket.is_linked:  # BaseColorにリンクがあるかチェック

[ノード.]is_linkedがTrueの場合そのノードにリンク(接続)しているということになります。

以上でPythonからBlenderのマテリアルが使用しているテクスチャを取得することができました。