2015年6月21日日曜日

Corrective Shapeの考え方

お久しぶりです。
気づけば前回から半年も投稿が開いてました;;



今回は『corrective shape』というものをスクリプトで最近作ったので
自分のメモ的な意味も含めて書いておきます。

ここで言うcorrective shapeとは既にデフォームしているオブジェクトに対して
blend shapeをfront of chainで使用した時に目的の形状になるための
『逆算された形状』という意味です。


















(gif作ってから思いましたが分かりにくいww)


例えば、既にdeformerによってデフォームしているオブジェクトをduplicateし
形状を変化させてblend shapeを入れたいとします。

deformer → blendShape
とすると目標のオブジェクトの形状にはなりますが
これではdeformerの効力がなくなります。

なので
blendShape → deformer
の順にするとblendShapeで変形した後に
deformerが動作しますがdeformer変形後に形状を作っているので
目的の形状にはなりません。

それを
blendShape → deformer
のノードコネクションでも目的の形状になるよう逆算した形状を作るのが
今回のcorrective shapeです。

とまぁ偉そうに書いてますがcorrective shapeの考え方自体は私が考えたものではないです。
まぁ詳しくはcorrective shapeでググってみてくださいw



さて本題。
説明しやすくするために名前を決めます。

original ・・・ deformerが入っているオブジェクトの元々形状
target ・・・ deform後にduplicateして変化させた目的の形状
base ・・・ deformerが入ったあとのオブジェクトの形状

※baseはtargetをduplicateしたときと同じdeform状態です



作成するための考え方

1.baseの頂点の位置を取得
2.baseの頂点のxyz軸をmatrixとして取得
3.targetの頂点の位置を取得
4.3から1の値を減算しローカライズ
5.2のmatrixと4の値の積を求める(座標変換)
6.originalの頂点に5の値をセット
7.完成!

※今回作成したスクリプト自体は全てobject spaceでやりとりをしています



matrixつかうと座標変換がめちゃめちゃ楽ですね。

今回はopenmayaのMMatrixを使ってますが
書き方で
× MMatrix × MPoint
○ MPoint × MMatrix
という使い分けがあるようです。ややこしや。


今回のようなイテレートが必要なものはopenmayaとかapiの
ありがたみをすごく感じますね。



今回はこの辺でー
次回はまた気が向いたときに更新しますw

0 件のコメント:

コメントを投稿