その時、手首のXYZの回転値がRoll方向や縦横方向を表しているわけではないので、単純に手首のX軸値の50%だけ補助骨を追従させるという事は厳密には正確では無く、姿勢によっては予期しない結果なることがあります。
オイラー角の回転値をRoll方向、縦方向、横方向に分解するというのは既にMayaでプラグインを作成して公開している素晴らしい方がいます。
https://github.com/ryusas/maya_rotationDriver
ソースも公開されているので同じような計算をMBで作成すればいいのですが、クォータニオンを使用して高度な計算をしているので難易度がかなり高いです。
そこでMotionBuilderの標準機能だけを使用してオイラーの回転値を分解して前腕の補助骨を駆動させる方法を紹介します。
骨階層は以下の図のような階層でキャラクタライズ時の時のTスタンスの姿勢を前提としています。
まずはNULLを4つ作成して、下図のような名前と階層構造を作成します。
PANならY軸(横方向)、TILTならZ軸(縦方向)、ROLLならX軸(捻り方向)に曲がるNULLです。
そして、各PAN、TILT、ROLLのRotationOrderとMinとMaxを以下の画像のように設定していきます。
PANならY軸(横方向)、TILTならZ軸(縦方向)、ROLLならX軸(捻り方向)となっていますので各有効軸が最後にくるようにRotationOrderを変更します。
PAN(RotaionOrder XZY)
TILT(RotaionOrder XYZ)
ROLL(RotaionOrder YZX)
また、有効軸以外が動かないようにMinとMaxを設定します。
次に、4つのNull群を肘の骨(ForeArm)の子供に親子付けし、位置のみを手首(Hand)の骨に合わせます。回転は合わせません。
次に、手首の骨と各PAN、TILT、ROLLをRotationコンストレイントを作成していきます。手首の骨をSource、NullをConstrained Objectとして設定します。
設定したらSnapでコンストレイントをアクティブにします。
この状態で、手首の骨を回すとRotationの値が各成分に分解されたのが各PAN、TILT、ROLLに入る状態になります。
後は捻り方向の成分が入るROLLのNULLの値の50%だけ補助骨が追従するように下図のようにRelationコンストレイントを作成します。
これでRollの骨のRiggingは以上です。
デメリットとして階層が増えたり、手間が少しかかる事ですが、
メリットとしてはMotionBuilderの標準機能だけでRotationを捻り方向、縦方向、横方向と分解出来るという点です。
また応用次第ではMocapなどでアニメーションされた物を今回の方法でRotatioを分解してあげることで、Rotationのアニメーション編集がしやすくなる事があります。
次に、4つのNull群を肘の骨(ForeArm)の子供に親子付けし、位置のみを手首(Hand)の骨に合わせます。回転は合わせません。
次に、手首の骨と各PAN、TILT、ROLLをRotationコンストレイントを作成していきます。手首の骨をSource、NullをConstrained Objectとして設定します。
設定したらSnapでコンストレイントをアクティブにします。
この状態で、手首の骨を回すとRotationの値が各成分に分解されたのが各PAN、TILT、ROLLに入る状態になります。
後は捻り方向の成分が入るROLLのNULLの値の50%だけ補助骨が追従するように下図のようにRelationコンストレイントを作成します。
これでRollの骨のRiggingは以上です。
デメリットとして階層が増えたり、手間が少しかかる事ですが、
メリットとしてはMotionBuilderの標準機能だけでRotationを捻り方向、縦方向、横方向と分解出来るという点です。
また応用次第ではMocapなどでアニメーションされた物を今回の方法でRotatioを分解してあげることで、Rotationのアニメーション編集がしやすくなる事があります。
0 件のコメント:
コメントを投稿