🎨

ArnoldでメッシュにRGBを割り振るAOVs(RGB Matte AOVs)を作成する

に公開

ArnoldでRGB Matte AOVを作成しオブジェクトごとに異なる色を割り当てる方法を調べたところ以下の記事を見つけたので、スクリプト化します。
https://tablogweb.wordpress.com/2020/09/04/arnold-rgb-matte-aovs-part2/

準備

まず、ArnoldのAOV (Arbitrary Output Variable) を作成します。これにより、指定したカラー属性を出力するAOVが作成されます。
(元記事の(2)の工程)

core.createOptions()
aovs.AOVInterface().addAOV("id_manual_aov", aovType='rgba')

cmds.shadingNode("aiUserDataColor", asUtility=True, name="id_manual_color")
cmds.setAttr("id_manual_color.attribute","aovColor",type="string")
cmds.shadingNode("aiUtility", asUtility=True, name="id_manual_utility")
cmds.setAttr("id_manual_utility.shadeMode",2)
cmds.connectAttr("id_manual_color.outColor","id_manual_utility.color",f=True)
cmds.connectAttr("id_manual_utility.outColor","aiAOV_id_manual_aov.defaultValue",f=True)

上記のスクリプトを実行すると、"id_manual_aov" というAOVが作成され、オブジェクトのカラー属性が出力されるようになります。

RGBを指定

次に、オブジェクトにRGBカラー属性を追加します。この属性は、AOVで使用するカラー情報です。
(元記事の(1)の工程)

def add_custom_attr_R(mesh:str):
    cmds.addAttr(mesh, ln="mtoa_constant_aovColor", at="double3")
    cmds.addAttr(mesh, ln="mtoa_constant_aovColorX", at="double",p="mtoa_constant_aovColor")
    cmds.addAttr(mesh, ln="mtoa_constant_aovColorY", at="double",p="mtoa_constant_aovColor")
    cmds.addAttr(mesh, ln="mtoa_constant_aovColorZ", at="double",p="mtoa_constant_aovColor")
    #GとBは引数の数値を変える
    cmds.setAttr(f"{mesh}.mtoa_constant_aovColor",1,0,0)

# サンプル
cmds.polySphere()
add_custom_attr_R("pSphereShape1")

これで、"pSphereShape1" には赤色が割り当てられました。他のオブジェクトにも同様の手順でカラーを設定できます。

おまけ

Render Viewでカラーが反映されない場合は、以下の関数を実行してメッシュを再評価してください。

def reload_mesh(shape):
    value = cmds.getAttr(f"{shape}.aiSubdivFrustumIgnore") or False
    cmds.setAttr(f"{shape}.aiSubdivFrustumIgnore", value)

機構はわかりません。

Discussion