« R10.5 | メイン | ボーンドリヴンモーフ(2) »

2007年10月15日

ボーンドリヴンモーフ(1) [ CINEMA 4D Plugins ]

 モーフィング=顔アニメに使うもの、と考えられがちだが、モーフはボーンによる変形を補助する機能としても有効だ。

 ボーンによる変形は基本的にはポイントを回転させることしかできない。たとえば人間のヒザ関節のように180度近くまで曲がるような場合、関節の内側の部分で「肉」が完全にめり込んでしまうことになる(下図/上段)。
 こういう問題を避けるために、関節を多重化する、より狭い領域での稼働を追加するなど、ボーンの動作を複雑化させる方向での解決法も使われているが、操作がどんどんややこしくなるだけで生産性は低いように思う。
 ボーンであれこれ工夫するのではなくて、モーフを使って圧迫された「肉」の変形を再現すれば、正攻法であっさりと解決できる(下図/下段)。

071015_CDM_3.gif

 ムービーで実際に動いている様子を比較すると、モーフを併用することで得られる効果は一目瞭然だ。

 ボーン変形のみ
 モーフを併用

 おなじみCactus DanのプラグインCD Morphや最近のMOCCAには、最初からこういう使い方を想定したオプションがついている。MOCCAのことはよく知らないので、ここではCD Morphでの実例を紹介する。この手法にはいろんな呼び方があるようだが、さしあたりボーンドリヴンモーフ(Bone Driven Moph)と呼ぶことにする。

 当たり前だが、モーフ自体の設定は先にやっておく。
 CD Joints & Skinであれば、メッシュをジョイントで曲げた状態でも普通にモーフターゲット編集ができるので、単純なモーフと同様に作業できる(CINEMA 4D純正のボーン/ジョイントの場合、「変形を編集」を有効にすると変形されているポイントは座標系が見た目と一致しないのでかえって厄介なことになる)。

 モーフをコントロールするのはヒザ関節のボーン(ジョイント)。

071015_CDM_4.gif

 モーフが適用される脚のメッシュには「Morph Reference」タグ、ヒザのジョイントにはモーフターゲットとなる「CD Morph」タグがついている。Morphタグはタグ内部のスロットで脚のメッシュを参照しているので、タグ自体は他のオブジェクトに移動できる。タグをヒザのジョイントにつけることで、このジョイントをモーフを制御するオブジェクトとして認識できるようになるわけだ。

071015_CDM_5.gif

 Morphタグで「Morph using Object Rotation」(拙訳日本語版では「ボーンの回転でモーフ」)をオンにすると、このタグのつけられているオブジェクトのローカル角度がモーフミキサーの適用量をコントロールするようになる。この例ではヒザ関節はP回転なので軸はPだ。また「Min」(最小)が「-95度」、「Max」(最大)が「-150度」となっているので、「-95度」まではモーフミキサーは「0%」、そこからモーフ量が増大し始め、「-150度」で「100%」となる。「Clamp Min/Max」(最小/最大で止める)をオンにしておかないと、ジョイントのP角度が指定した最小/最大値を超えた範囲ではモーフミキサーの値がマイナスや100%超になるので注意。

071015_CDM_6.gif

 サンプルファイル(CINEMA 4D R10、CD Joints & Skin、CD Morphが必要です)

 ボーン(ジョイント)のローカル角度に不都合があったり、単純に関節の曲がり具合とモーフを直結するだけでは済まない場合(複数のモーフターゲットを使う、モーフと角度の関係がリニアでない、など)は、XPressoで自前のコントロールを構築することになる。

 CD Joints & SkinとXPressoを組み合わせる場合は、ジョイントのローカル座標だけでなくジョイントが内部的に持っている座標値を取得できる。

071015_CDM_8.gif

 この座標値は「Zero Transformation」(座標変換をゼロにする)ボタンで初期値をゼロにすることができ、ジョイント自体のローカル座標とは別に「初期状態から稼働した差分の値」を取得できるので、XPressoで扱いやすい。

071015_CDM_7.gif

投稿者 ヒロツ : 2007年10月15日 13:14

コメント

たびたびお邪魔します。先日は余計な書き込みをしてしまったようで申し訳ありません。
今回はサンプルファイルもあって、また刺激になります。サンプル用のObjも最小の面数できれいな形状になってますし、モーフとあわせて柔らかい表現ができそうで羨ましいです。
RIGはイロイロ作りこむと遅くなる気はします。プラグインとして提供されているものであれば動作も速いのかもしれませんが、レスポンス悪くなって試行錯誤を妨げるようなら、手で調整した方がきっと能率いいですね。

投稿者 スエヒロ : 2007年10月15日 23:54

いやいやご遠慮なくコメントしてやってください。僕も好きでやってるブログですから。

サンプルは最初はただのパイプだったんですが、実感わかないんで一応、脚っぽくしました。どうせならひざ頭なんかもうちょっときちんと作ればよかったですかね。サンプルだと、曲げたときにヒザが引っ込みすぎです。

投稿者 ヒロツ : 2007年10月16日 10:39

CD JointのTransformation値もやっぱり「0」のはずが「360」になったりすることがありますね。XPressoで値を引っ張っるなら、数式ノードの「mod」で切り捨てるのが定石でしょうか。僕がいましがたやってたやつでは、B角度が「0度」でモーフ最小、「90度」と「-90度」でモーフ最大になるやつだったので、数式「abs ( sin ($1) )」使ったらちょうどよかったです。

投稿者 ヒロツ : 2007年10月16日 23:00

ふと思ったのですが、時間的な連続性を考えると360度を超える必然性があったりするかもです。
試しにCubeのPrimitiveに0,90,180,360,450とBANK角のKeyを打った場合と、0,90,180,270,0,90と打った場合では動きが異なりました。当然ですが・・・。
ちなみに360度を越える回転角度を与えた場合でも、Global座標では360未満になっていました。座標表示で[object]となっている部分を[world]にすると確認できますよね。
Jointでひたすらグルグル回るような動きがなければmodで丸める事に問題はナイですが、用途によってはそのままにした方が良いかな、と思いました。

投稿者 スエヒロ : 2007年10月17日 01:18

車輪みたいにグルグル回るやつだと丸めちゃまずいですよね。キャラの関節の場合は360度超えたらエラーと決めてかかってもダイジョブなような気がしますが、モーションの途中で丸める計算が発生すると、その直前のフレームで本来の回転と逆方向に一回転することになるのかも。
CD JointのJoint Transformationが0度から360度に化けるきっかけが何なのかはっきりしないんですが、僕が見たケースではアトリビュートマネージャで直接数値を入れたときに発生していたので、動作が連続的に補間できる状況を維持すればいいのかもしれません。あと、表示が360度になっていても関節が一回転してねじれてるわけではなく、メッシュの状態は正常だったので、オペレーションの途中で「どっち向きに回したのかわからない」状況が発生したときに、見かけの数値のみが狂うということなのかもしれません。
ともあれ、もう少し様子を見ることにします。

投稿者 ヒロツ : 2007年10月17日 07:40

コメントしてください




保存しますか?


※URLが多数含まれているとコメントスパムとみなされることがあります
※投稿後すぐにコメントが反映されない場合はリロードしてみてください