Tips

modoでフロアコンタクトを作る方法

modoでフロアコンタクトを作る方法について書いてみます。

フロアコンタクトはアイテムが床より下に行かないようにする、めり込み補正リグです。この記事ではIKゴールが床より下に移動しない設定にしています。

 

 

まずは単純にワールドのY軸0を床と想定した場合です。

サンプルファイル

 

スケマティックはこんな感じです。

IKControllerの「ワールド位置」をMatrix Vectorを使用して3軸に分解します。
条件式を使用してY位置が「0.0327」より小さい場合は「0.0327」を出力します。「0.0327」より大きい場合はIKControllerのY位置をそのまま出力します。「0.0327」という値はIKGoalと床のオフセットぶんの距離です。
判定結果をMatrix Constructを使用してマトリクスにして、IKGoalの「ワールド位置」に接続します。

IKGoalは非表示にして、普段はIKControllerを操作する想定のリグです。今回は足首のIKゴールだけめり込み防止しているのでつま先がめり込んでいます。足首からつま先にIKを設定すれば、つま先のめり込みも防止できると思います。

 

 

任意のメッシュを床とする場合です。

サンプルファイル

 

スケマティックはこんな感じです。

左側は、IKControllerの位置を基準にIntersect(サーフェースコンストレイント)でMeshContactの位置を制御しています。
IntersectはIKControllerから-Y軸方向にレイを飛ばしてメッシュと当たり判定を行います。しかし、IKControllerがポリゴン背面に移動するとIntersectが動作しなくなります。
常に+Y軸方向からレイを飛ばしたいので、Matrix Vectorを使用してマトリクスを3軸に分解し、Y位置を適当に設定した後、Matrix Constructでマトリクスに戻した値をIntersectで使用しています。
その後、IKGoalとメッシュのオフセットが欲しいので、Intersectの「位置出力」をMatrix Vectorを使用して3軸に分解、「0.0327」を足してMeshContactの「ワールド位置」に出力しています。

右側は、Dynamic Parentを使用して、IKControllerがメッシュを貫通したらIKGoalをMeshContactにペアレント、IKControllerがメッシュから離れたらIKGoalをIKControllerにペアレントしています。
IKControllerがメッシュを貫通したかどうかを判定するため、IKControllerのY位置からMeshContactのY位置を減算して、値がプラスなら貫通していない、マイナスなら貫通と判定しています。
Relationshipを使用してプラスなら1、マイナスなら2をDynamic Parentの「ペアレント」に出力しています。ただし、Intersectはメッシュが無い場合に0を出力するので、条件式を使用してIntersectの「距離」が0の場合は1、0以外の場合はRelationshipの値をそのまま出力するようにしています。この処理はRelationshipを使用せず条件式ノードだけで同じ処理が作れますが、ノード数が少なくカーブで編集するのが好きなのでRelationshipを使ってます。

 

 

フロアコンタクトをはじめて知ったのは、Motion Builderの新機能紹介でした。当時キャラクターアニメーションの弱かったLightWaveを補助するため?、LightWaveの国内代理店であるDSTORMがFiLMBOXの取り扱いを開始したことで、LightWaveユーザーのFiLMBOX認知度が高かったように思います。

FiLMBOXはモーションキャプチャーの編集に特化したソフトで、床のめり込みを補正する機能としてフロアコンタクトが導入されたように記憶しています。その後、Mayaに追加されたHumanIKにもフロアコンタクト機能が受け継がれています。

個人的に手付けモーションならフロアコンタクトは無くても困らないのですが、似たようなリグを作りたくなるかも知れないのでメモがてら記事を公開しておきます。

Modo Tips



 

記事のまとめページ

コメント

  1. gon より:

    ありがたいです

コメントを残す