IKやモディファイヤの影響を受けたスケルトンのひねり具合を取得するには
https://www.youtube.com/watch?v=9blemZ9r-dg
スケルトンに対してIKやモディファイヤを設定している場合であっても、FKとIKを自前でブレンドさせたい場合、またモーフなど他のチャンネルと回転角度を連動させたい場合など、ローカルの回転角度が必要となる場面があります。従来まではこのローカルの回転角度をすぐに取得する手段はなく、スケマティックで行列計算を行う必要がありました。バージョン13.2からはこの回転角度を取得するモディファイヤTwist Extractorが標準で実装されるようになり、処理の負荷が軽くなっています。
まずは簡単にサンプルとなるスケルトンを作り、階層を複製してもう一つ同じようなスケルトンを作っておきます。片方にIKの設定を行います。このIKの設定を行った方のスケルトンのトランスフォームのローカルを見てみても、スケルトンは回転しているにも関わらず、回転角度は入っていません。ではこのIKが設定されたスケルトンの回転角度を取得して、もう一方のIKを設定していないスケルトン階層の方へと移してみます。
まず、今回新たに追加されたこの回転角度を取得するためのモディファイヤTwist Extractorをスケマティックビューへと追加します。追加 > 行列 > Twist Extractorを追加します。ノードを見て分かる通り、取得したいスケルトンの親アイテムのワールド位置とワールド回転、それと自身のワールド位置、ワールド回転の行列を元にロール・ピッチ・ヨーの値を算出します。ここで入力に必要な親アイテムや自身の行列チャンネルを設定してもよいのですが、もっと簡単な方法があります。角度を取得したいスケルトンを選択した上で、ツイストエクストラクタタブにあるセットアップモードをオフにし、自動接続ボタンをクリックします。そうすると、自動的に必要な行列チャンネルを接続してくれるため、設定は非常に簡単です。
では実際にこの回転角度を移してみましょう。もう片方のスケルトン階層のルートに当たるスケルトンは、そのまま行列の値を回転角度へと分解するだけですので、このTwist Extractorモディファイヤは必要ありません。回転行列の値を回転角度へと分解するには、追加 > 行列 > Matrix to Eulerモディファイヤを追加して使います。IKを設定している方のルートスケルトンのワールド回転を、Matrix To Eulerのワールド回転へと接続し、その出力をIKを設定していない方のルートスケルトンの回転値へと接続します。
ただしこうしても値が一致しない場合が出てきます。これはなぜかというと、チャンネルをタブを見てみると、最初にスケルトンの階層全体を複製した時に、ゼロのチャンネルに既に回転角度が入ってしまっているためです。このため、二重に回転が設定していることになり、結果が一致していません。こういった場合には、回転ゼロのチャンネルを削除し、トランスフォームの回転だけに値が入るだけにすると、結果が一致するようになります。
次にその下の階層にあるスケルトンに、Twist Extractorで抽出したローカル回転角度を入力します。Twist Extractorのセットアップモードをオフにし、ピッチの値を回転X、ヨーの値を回転Y、ロールの値を回転Zへと接続します。この回転行列から回転角度を抽出する場合、同じ回転を表す2つの角度の組み合わせが抽出されます。もし動きの流れによって正しく抽出できていないと思えた場合には、プロパティの切り替えオプションのオンオフを切り替えてみてください。
このTwist Extractorを使うことで、自前でローカルの角度を取得する必要なく、簡単に値を取得できるようになります。