このように、CyclesでImage Textureノードを追加し、画像を設定した上でノードを選択状態にしておき、スクリプトを走らせると、
Vrayのノードとして追加される。
import bpy # vray for blenderに必要 from vb30.lib import LibUtils from vb30.lib import BlenderUtils from vb30.nodes import tree_defaults
# 選択したノードを取得する # Cycles側でImageTextureノードを特定するコードを書いても良いが # ImageTextureノードを追加して選択した上でこれを呼び出した方が多分単純なのでこれを使う # CyclesのImage Textureノードを取得できれば何でも良い def get_selected_node(material): node_tree = material.node_tree sel = [x for x in node_tree.nodes if x.select] return sel[0]
# 追加した Vray ノードを接続する # _VrayImageNode は _vrayNodeTree から探すこともできるけれど # せっかく特定できているので引数で渡す def connect_image_and_material(_vrayNodeTree,_VrayImageNode): # vrayのStandard Materiahを取得。デフォルトで存在しているはず matStandard = None for v in _vrayNodeTree.nodes: if v.name == 'Standard Material': matStandard = v vstand = matStandard vstand.location.x = -250 vstand.location.y = 0 vtex = _VrayImageNode vtex.location.x = vstand.location.x - vstand.width - 50 vtex.location.y = 0 # ノードを接続 _vrayNodeTree.links.new( vtex.outputs['Color'] , vstand.inputs['Diffuse'] )
# マテリアルからImage Textureノードを特定し、Vrayのノードを追加する def set_vray_image_node(mat): # Image Textureノードがマウスで選択されている事が前提 CyclesNode = get_selected_node(mat) # Vrayに切り替え bpy.context.scene.render.engine = "VRAY_RENDER_RT" # vray用のマテリアル追加 tree_defaults.AddMaterialNodeTree(mat) mat.vray.ntree.name = mat.name + '-vray' # vrayのテクスチャノード追加 VrayImageNode = mat.vray.ntree.nodes.new(type='VRayNodeMetaImageTexture')
# vrayのテクスチャノードにテクスチャを指定。 VrayImageNode.texture.image = bpy.data.images[CyclesNode.image.name]
# ノードを繋ぎレンダリングできるようにする connect_image_and_material(mat.vray.ntree,VrayImageNode)
material = bpy.data.materials['Material'] set_vray_image_node(material)