DAZ Importer 1.4でBlenderへExportした結果のマテリアルがある。
これのテクスチャノードが、Bump用なのか、あるいはDiffuse用なのか...を知りたい。
import bpy
# @brief 与えられたCyclesのノードツリーの中のImage Textureノードを全て取得して返す # @param [in] nodetree Cyclesのノードツリー # @return Image Textureノードの一覧 def get_all_textures(nodetree): nodes = nodetree.nodes texturenodelist = [] for node in nodes: if node.type == 'TEX_IMAGE': texturenodelist.append(node) return texturenodelist
# @brief ノードのto_nodeを辿り、特定のノードが見つかるまで再帰的に検索する # @param [in] node Cyclesのノード # @return 見つかったノード # @retval None 見つからなかった場合 def get_input_to(node): if node.type == 'BUMP': return node if node.type == 'NORMAL_MAP': return node elif node.type == 'BSDF_DIFFUSE': return node elif node.type == 'BSDF_GLOSSY': return node elif node.type == 'BSDF_PRINCIPLED': return node for output in node.outputs: for link in output.links: return get_input_to(link.to_node)# 目的のノード出ないなら再帰呼び出し return None
# @brief テクスチャノードから、そのノードが繋がっているノードを探す # @param [in] texnode CyclesのImage Textureノード # @return 見つかったBump,Normalまたは各種BSDFノード # @retval None 見つからなかった def get_tex_input_to(texnode): for link in texnode.outputs["Color"].links:# テクスチャノードの"Color"に接続されたノードを探す prevnode = link.to_node tonode = get_input_to(prevnode) if tonode is not None: return tonode return None
# @brief マテリアルスロット内の全てのマテリアルについて、テクスチャノードの接続先を検索する # @param [in] slots マテリアルスロット # @return なし def about_all_material(slots): for slot in slots: texturenodelist=[] material = slot.material nodetree = material.node_tree print("------" , material.name , "-------") texturenodelist = get_all_textures(nodetree) for texnode in texturenodelist: inputto = get_tex_input_to(texnode) print( texnode.name , inputto )
print("---------------") print("---------------") print("---------------") # 呼び出し about_all_material(bpy.context.active_object.material_slots)
------ Torso-1 ------- Acicia_NM_1002 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_B_1002 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1002 Base <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_1002_SSS <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_Torso_Ref_1002 <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> ------ Face-1 ------- Acicia_NM_1001 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_B_1001 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1001 Shadow 07 <bpy_struct, ShaderNodeBsdfDiffuse("Diffuse BSDF")> Acicia_1001_SSS Default None Acicia_1001_Spec None ------ Lips-1 ------- Acicia_NM_1001 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_B_1001 <bpy_struct, ShaderNodeBump("Bump")> Acicia 1001 Lip 02 <bpy_struct, ShaderNodeBsdfDiffuse("Diffuse BSDF")> Acicia_1001_SSS Lip 02 None Acicia_1001_Spec None Acicia_Spc_1001 <bpy_struct, ShaderNodeBsdfGlossy("Glossy BSDF")> ------ Teeth-1 ------- Acicia_MouthNM_1005 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_MouthB_1005 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1005 <bpy_struct, ShaderNodeBsdfDiffuse("Diffuse BSDF")> ------ Ears-1 ------- Acicia_NM_1001 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_B_1001 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1001 Shadow 07 <bpy_struct, ShaderNodeBsdfDiffuse("Diffuse BSDF")> Acicia_1001_SSS Default None Acicia_1001_Spec None ------ Legs-1 ------- Acicia_NM_1003 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_B_1003 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1003 Base <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_1003_SSS <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_Rh_1003 <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> ------ EyeSocket-1 ------- Acicia_B_1001 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1001 Shadow 07 <bpy_struct, ShaderNodeBsdfDiffuse("Diffuse BSDF")> Acicia_1001_SSS Default None Acicia_1001_Spec None Acicia_NM_1001 <bpy_struct, ShaderNodeNormalMap("Normal Map")> ------ Mouth-1 ------- Acicia_MouthNM_1005 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_MouthB_1005 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1005 <bpy_struct, ShaderNodeBsdfDiffuse("Diffuse BSDF")> ------ Arms-1 ------- Acicia_NM_1004 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_B_1004 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1004 Base <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_1004_SSS <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_Rh_1004 <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> ------ Pupils-1 ------- ------ EyeMoisture-2 ------- ------ Fingernails-1 ------- Acicia_NM_1004 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_B_1004 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1004 Base <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_1004_SSS <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_Rh_1004 <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> ------ Cornea-1 ------- ------ Irises-1 ------- Acicia_EyesNM_1006 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_EyesB_1006 <bpy_struct, ShaderNodeBump("Bump")> Acacia Eyes Color Red 02 <bpy_struct, ShaderNodeBsdfDiffuse("Diffuse BSDF")> ------ Sclera-1 ------- Acicia_1006 <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> ------ Toenails-1 ------- Acicia_NM_1003 <bpy_struct, ShaderNodeNormalMap("Normal Map")> Acicia_B_1003 <bpy_struct, ShaderNodeBump("Bump")> Acicia_1003 Base <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_1003_SSS <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")> Acicia_Rh_1003 <bpy_struct, ShaderNodeBsdfPrincipled("Principled BSDF")>
特定できなかった物はNoneが入っている