9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MayaAdvent Calendar 2019

Day 11

matrixを用いてlocalのコンストレインを再現する

Last updated at Posted at 2019-12-10

前回の記事では、worldMartixを用いてコンストレインを再現していました。
今回は、localのmatrixでコンストレインを再現してみることにします。

支点における目的箇所の位置・回転をlocal座標を用いて再現する

具体例がないと、この見出しは、なんのこっちゃ??? なので、お題を設けたいと思います。
お題:"spineD_prx"支点における"hand_prx_L"(左手首)の位置と回転情報を、locatorを用いて再現する

multMatrixを用いてlocal座標のmatrixをつなぐ

import pymel.core as pm
pm.createNode("multMatrix", n=u"hand_prx_L_spineD_prx_multMat")

transformノードのlocal座標を意味するアトリビュートは.matrixです。
hand_prx_Lからさかのぼってshoulder_prx_Lまでのlocal座標を足していくと、
おのずとspineD_prxにおけるhand_prx_Lの位置関係がmatrixで取得できるわけです。

下図のように各transformのmatrixをmultMatrixのmatrixIn[0]からつないでいきます。
2018-12-12_14h27_45.png

ここで重要なのは、さかのぼった順番に.matrixInへコネクションをする、という事です。

decomposeMatrixでtranslate, rotateを出力しやすくする

前回の記事で既にお分かりかと思いますが、
matrixのままだと位置・回転情報を出力しにくい為、decomposeMatrixを用います。

pm.createNode("decomposeMatrix", n=u"hand_prx_L_spineD_prx_decMat")

2018-12-12_14h43_08.png

locatorへコネクト!

decomposeMatrixから下図のようにhead_pos_Lへコネクトを行う
2018-12-12_14h50_36.png

結果

hend_pos_Lを見ると、なんだか関係のない場所にあるように思えます。(下図)
2018-12-12_15h23_28.png
これはspineD_prxを支点として取得したmatrixの結果なので、spineD_prxの位置が原点だとすると、そうなることになります。

理解できない場合は、spineD_posをspineD_prxの位置に用意し、hand_pos_Lを子供にすれば一目瞭然です。(下図)
2018-12-12_15h26_57.png

jointの最上位にあたる箇所、hipTranslation_prxを移動させてみましょう。
hand_pos_Lはついてきません。(下図 赤い箇所)
2018-12-12_15h29_06.png

shoulder_prx_Lを回転させてみましょう。
2018-12-12_15h36_22.png

hand_pos_Lも同期して回転しました。

何に使うか?

この仕組み、様々な使い道があると思いますが、私はこれをデフォームやシミュレーション要素を含むリグでよく用いています。

なぜなら、local座標系でmatrixを使うという一見カッコいい小技が使えるからです!
...うそです、ごめんなさい。
それだけの面倒な小技、できることならば私は使いたくありません。

これを使う大きな要因の1つの、ある条件下におけるエラーを除外するためです。

例えば、原点からのリグへの位相が大きい場合、Mayaの計算制度が落ちてパーツなどがズレる事があります。皆さん経験ありませんか?
それを回避するためです。

映像系の制作過程ではよく起こることですが、
ゲーム系ではどうなのでしょう?
ゲームだとその物全体をフィールド上で動かす要素は別となってると思うので、そういうエラーには陥らないのかな?
特に宇宙や大海原のような広大な敷地でアニメーションする必要がある場合、
髪の毛が頭皮からズレてたりするんですよね。。。

そんなエラーを回避するのにmatrixの理解が必要なんて、ですよね!

12月10日に公開されたMaya2020のヘルプでは、
offsetParentMatrixのinput行列が追加されると記載がありました。
恐らく、今回記載したdecomposeMatrixを介すことなく、直接matrixでトランスフォーム制御ができるという事なのかな。少し楽になりそうですね!

そういう意味では超ギリギリセーフの記事となってしまいました(汗)

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?