テクスチャを使って瞳を作ることってよくありますよね?
その時、目線のコントロールはどのように行っていますか?
目線のコントロールにコントロールリグの移動を使っている方は必見です!
これを機会に回転を使って目線をコントロールしてみましょう。
回転で行うことで目先にある対象物を見る時にコントロールがかなり楽になります。
目線をIKでコントロールできる…というイメージです。
ただ、残念なことにMaya標準機能だけで実装するのは難しいです。
今回はexprespyという素晴らしいノードを利用して実装しました。
※ Maya2020.4を利用しています。
Python API 2.0でアルゴリズムを解説
import maya.cmds as cmds
import maya.api.OpenMaya as api
selection_list = api.MSelectionList()
selection_list.add("projection_srfShape") # 仮想のNurbsSurfaceを入れる
dag = selection_list.getDagPath(0)
nurbs_srf = api.MFnNurbsSurface(dag) # MFnNurbsSurfaceの機能を使うための関数セット
ray_source = api.MPoint() #レイを打ちはじめるポイント、始点、MPointを引数なし指定 = 原点(0,0,0)
ray_dir = cmds.getAttr("rayDirection.translate")[0] # レイを打つ方向、rayDirectionは方向を持つロケーター
ray_dir = api.MVector(ray_dir)
hit_point, hit_u, hit_v = \
nurbs_srf.intersect(ray_source, ray_dir)
cmds.setAttr("hit_point.translate", *list(hit_point)[:3]) # hit_pointというロケーターにセット
exprespyをダウンロード&インストール
以下、githubからダウンロードしましょう。
説明がとても丁寧に書かれているのでインストール方法はこちらでは割愛します。
https://github.com/ryusas/maya_exprespy
また、サンプルシーンの中も高度なテクニックが詰まっています。
サンプルを見るだけで面白いですよ。
exprespyを使っての実装
やっていることはPython API 2.0のものとほぼ同じです。
DagObjectの取得が簡単にできるようになっています。よって、MSelectionListらへんはexprespyでは書かなくてOK!ということです。
srf = projection_srfShape.local # nurbsSurfaceのlocal(outputGeometry)を取得
rayStart = api.MPoint(eye.translate)
rayDir = api.MVector(rayDirection.translate)
fnNurbsSurface = api.MFnNurbsSurface(srf)
point, u, v = fnNurbsSurface.intersect(rayStart, rayDir)
eye_p2d.translateFrameU = u - 0.5 # eye_p2dは目のテクスチャのplace2dTextureノードです。
eye_p2d.translateFrameV = v - 0.5
動かす時の注意点!
今回の動画では原点で動くようにしただけです。
よって、原点からジョイント(eye)をそのまま動かすと挙動がおかしくなります。
それは、rayDirectionというロケーターが置き去りになるからです。
目の関連のジョイント、方向ベクトルのロケーター、これらをグループ化して動かせば問題ないでしょう。
コメント