MAYA,Python [MAYA-Python]距離に応じて違う値の頂点カラーを設定してグラデーションにする

[MAYA-Python]距離に応じて違う値の頂点カラーを設定してグラデーションにする

maya_python_change_the_value_of_the_vertex_color_topimage

前の記事でMAYAのスクリプトを使った、ポリゴン頂点の位置を取得する方法を書きました。

MAYAのスクリプトでポリゴン頂点の位置を取得するコマンド
pointPosition

ポリゴンの頂点には位置情報の他にカラーの情報もあり取得はもちろん編集もできます。

MAYAのスクリプトでポリゴンの頂点カラーを扱うコマンド
polyColorPerVertex

そこで今回は、ポリゴン頂点の位置情報と頂点のカラーの情報をあわせたPythonスクリプトを作りたいと思います。


ポリゴン頂点の位置情報を取得する

ポリゴン頂点の位置を取得するには

pointPosition

を使います。

import maya.cmds as cmds

selectedVertex_list = cmds.ls(sl=True)

vertex_pos_1 = cmds.pointPosition(selectedVertex_list[0])

print(vertex_pos_1)


説明:

vertex_pos_1 = cmds.pointPosition(selectedVertex_list[0])

pointPositionで選択した頂点の位置を取得、変数に代入

実行:

ポリゴン頂点を選択して実行

ポリゴン頂点を選択


選択した頂点の座標位置が出力されました。

[6.892028404549504, 2.461551721504235, -0.5]

ポリゴン頂点のカラー情報を取得する

MAYAのスクリプトでポリゴンの頂点カラーを扱うコマンドは

polyColorPerVertex

ポリゴン頂点のカラーの値を取得する

polyColorPerVertexでポリゴン頂点のカラーの値を取得します

import maya.cmds as cmds

cmds.polyColorPerVertex( rgb=True  ,q=True)


結果:

ポリゴンの頂点を選択して実行

ポリゴン頂点を選択


選択した頂点のRGBの値が出力されました。

[0.21660000085830688, 0.42800000309944153, 0.21660000085830688]

ポリゴン頂点のカラーの値を編集する

polyColorPerVertexでポリゴン頂点のカラー情報を編集します

import maya.cmds as cmds
cmds.polyColorPerVertex( rgb=(0.8 ,0.4 ,0.3) ,a=1 ,cdo=True)


説明:

cmds.polyColorPerVertex( rgb=(0.8 ,0.4 ,0.3) ,a=1 ,cdo=True)

選択した頂点を r=0.8 ,g=0.4 ,b=0.3 ,a=1 で編集します。


結果:

ポリゴン頂点を選択して実行

ポリゴン頂点を選択


指定した値 r=0.8 ,g=0.4 ,b=0.3 ,a=1 で頂点のカラーが変わりました。

頂点カラーの値を変えました

原点から距離に応じた頂点カラーをセットする

ポリゴン頂点の座標の値と頂点カラーの値が取得できたので、原点からの距離に応じて設定する頂点カラーの色を変えるスクリプトを書きたいと思います。

import maya.cmds as cmds
import maya.mel as mm

selectedVertex_list = cmds.ls(sl=True)
selectedVertex_num =cmds.filterExpand(selectedVertex_list , sm=31)

for i in range(len(selectedVertex_num)):
    vertex_pos = cmds.pointPosition(selectedVertex_num[i])
    mm.eval("vector $vertex_pos_1 = << %s , %s , %s >>; " % (vertex_pos[0],vertex_pos[1],vertex_pos[2]))
    distance_value = mm.eval("mag $vertex_pos_1;")

    if distance_value <= 1.0 :
        cmds.polyColorPerVertex(selectedVertex_num[i], rgb=(0.0 ,0.0 ,1.0) ,a=1 ,cdo=True)

    elif distance_value > 1.0 and distance_value <= 2.0:
        cmds.polyColorPerVertex(selectedVertex_num[i], rgb=(1.0 ,0.0 ,0.0) ,a=1 ,cdo=True)

    elif distance_value > 2.0 and distance_value <= 3.0:
        cmds.polyColorPerVertex(selectedVertex_num[i], rgb=(0.0 ,1.0 ,0.0) ,a=1 ,cdo=True)    
        
    else:
        cmds.polyColorPerVertex(selectedVertex_num[i], rgb=(0.5 ,0.5 ,0.5) ,a=1 ,cdo=True)


説明:

selectedVertex_list = cmds.ls(sl=True)
selectedVertex_num =cmds.filterExpand(selectedVertex_list , sm=31)

選択した頂点のリストが纏まっていると扱えないので filterExpand でバラバラにします。

vertex_pos = cmds.pointPosition(selectedVertex_num[i])
mm.eval("vector $vertex_pos_1 = << %s , %s , %s >>; " % (vertex_pos[0],vertex_pos[1],vertex_pos[2]))

pointPositionで取得した頂点の位置の値をeval()でMELのvector型の変数”$vertex_pos_1″に文字列で当てはめます。

distance_value = mm.eval("mag $vertex_pos_1;")

MELのコマンド mag でvector型の変数 “$vertex_pos_1” の大きさ(長さ)を取得。Pythonの変数 “distance_value” に代入しました。


    if distance_value <= 1.0 :
        cmds.polyColorPerVertex(selectedVertex_num[i], rgb=(0.0 ,0.0 ,1.0) ,a=1 ,cdo=True)

    elif distance_value > 1.0 and distance_value <= 2.0:
        cmds.polyColorPerVertex(selectedVertex_num[i], rgb=(1.0 ,0.0 ,0.0) ,a=1 ,cdo=True)

    elif distance_value > 2.0 and distance_value <= 3.0:
        cmds.polyColorPerVertex(selectedVertex_num[i], rgb=(0.0 ,1.0 ,0.0) ,a=1 ,cdo=True)    
        
    else:
        cmds.polyColorPerVertex(selectedVertex_num[i], rgb=(0.5 ,0.5 ,0.5) ,a=1 ,cdo=True)

頂点の距離 “distance_value” に応じて頂点のカラーを設定します

結果:

カラーを設定する頂点を選択して実行。

複数の頂点を選択


設定した距離に応じて、頂点カラー色が変わりました。

距離に応じて頂点カラーの値をかえました

まとめ:平面以外のメッシュにも応用できる

平面ではなく立体物に対して実行しました。

立体物にスクリプトを実行


今回は原点からの距離に応じて設定する頂点カラーの値を変えましたが、原点からではなく自由に動かせるロケータからの距離にすると、もっと活用できる場面が増えると思います。


Twitter Facebook Pocket LINE はてブ

おすすめの関連記事
コチラの記事も読まれています
あわせてよく読まれている記事
タグ: ,