【Maya】スクリプトで頂点カラーをテクスチャからインポートする(+ブレンドシェイプを持つ場合の注意点)

この記事はMaya Advent Calendar 2018の6日目の記事です。

頂点カラーをブレンドシェイプを持つShapeに適用する

こんな感じでスフィアが3つあり、一番左の「pSphere1」が隣の2つのスフィアをターゲットとするブレンドシェイプを持つシーンがありまして。
f:id:tm8r:20181205200126p:plain

この「pSphere1」に対してテクスチャに焼き込んでいた頂点カラーをインポートしたいシーンについて考えます。

普通にGUIで実行する場合はPaint Vertex Toolで以下のボタンを押す形になります。
f:id:tm8r:20181205200430p:plain

これを実行するとpolyColorPerVertexがヒストリに追加されるので、ノンデフォーマーヒストリを削除します。
すると…
f:id:tm8r:20181205200540p:plain

このようにブレンドシェイプのターゲットにも頂点カラーが伝播していまいます。
ファイルサイズも結構増えちゃうのでつらみ。

というわけで不要なターゲットの頂点カラーを消していきましょう。

ターゲットに伝播した頂点カラーを削除する

情報弱者の僕が安直に考えると「頂点カラーを(0, 0, 0)にすればよいのでは?」となるんですが、頂点カラーは設定していなければそもそも値を持たないので、これだと対応としてはいまいちです。

そこでMayaのコマンドを検索してみると、polyDelVertexというコマンドがありました。
polyDelVertex command

が、これを実行するとやたら時間がかかる上にpolyDelVertexヒストリができてしまいます。
他のやり方を探してみると、polyColorPerVetexコマンドにremoveオプションがあるのを発見しました。
polyColorPerVertex command

というわけでこれをブレンドシェイプのターゲットにかけてやればよさそうです。

自動化する

これを毎回手でやるのは心が折れるので自動化しましょう。

頂点カラーの適用部分はこんな感じになります。

cmds.select(cl=True)
default_ctx = cmds.currentCtx()
mel.eval("artAttrColorPerVertexToolScript 4;")
cmds.select(mesh)

# 頂点カラーをインポート
cmds.artAttrPaintVertexCtx(cmds.currentCtx(), e=True, importfileload=texture)
cmds.setToolTo(default_ctx)

cmds.select(cl=True)
cmds.select(mesh, add=True)

# ノンデフォーマーヒストリを削除
mel.eval('doBakeNonDefHistory( 1, {"prePost"});')

その後ブレンドシェイプのターゲットの頂点カラーのお掃除をします。

if input_targets:
    cmds.select(input_targets)
    cmds.polyColorPerVertex(remove=True)
    for t in input_targets:
        # 頂点カラーの表示をオフにする
        cmds.setAttr(t + ".displayColors", 0)

この状態で実行してみると…
f:id:tm8r:20181205211408p:plain
やりました💪

全コードは以下をご覧ください。
github.com

ちなみに上のコードはこのように実行します。

vertex_color.import_vertex_color("pSphere1", "/Users/tm8r/Documents/maya/projects/default/sourceimages/vertex_color.png")

おわり

ブレンドシェイプがあると色々と手間が増えて大変ですね…!

本当はMayaのランチャーを作る話を書きたかったんですが、お仕事がアレのソレで無理だったので後半にまた書くかもしれません😇

明日はharayokiさんの「Mac+Maya Pythonで開発する話」です!
qiita.com

スポンサーリンク