本日は昨日に引き続き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の場合そのノードにリンク(接続)しているということになります。