Back to Overview

Matrix based constraint

Tools & Techart Topics

最近、リグにスケール情報を追加する新しい方法を検討しています。ユニバーサル・スケーリングだけでなく、階層を正しく機能させるためにセカンダリー・スケール・ジョイントが不要な方法も検討しています。 mayaでコンストレイントを使用した現在の設定で見つけた最も大きな問題は、コンストレイントされたジョイントの親がユニバーサルスケールされていない場合、ローテーションが壊れることです。

rotation breaks using default constraints

上記のセットアップでは、ロケータから子ジョイントに向けて、parentConstraintとscaleConstraintを使用しています。 基本的なトランスレート、ローテート、ユニバーサルスケールは完璧に動作しますが、一軸でのスケーリングを開始すると、回転がドライバーロケーターと一致しないことがわかります。

このセットアップを様々なケースで動作させるために、私はマトリックスコンストレイントプラグインの1つを検討し始めましたが、C++でのデバッグは非常に困難で、多くの時間を要します。これはデバッグのみを目的としています。ノード税のためにリグ上ではこのセットアップがかなり遅くなるので、プラグインベースのセットアップに変換するのがベストです。

nodegraph

上のノードグラフでは、出力ジョイントを駆動するために、合計3つの入力を使用しています。 (1)現在のドライバー、ロケーター (2) 駆動しているジョイントのジョイントオリエンテーション(同じオリエンテーションを維持するために、これらを複数設定している (3) 親ジョイント(制約条件の設定では、ドリブンジョイントのinverseParentMatrixとなる

ジョイントの向きを混合するために、四元数に変換して、これを行列の計算から分離します(4)。四元数は、現在のセットアップからの出力回転を新しい回転として計算します。

次にドライバーのworldMatrixが使用され、親オブジェクトの逆ワールドマトリックスと掛け合わされます(5)これはスケールとトランスレーションにのみ使用されます。

また、非一様なスケールが適用されたときに、親のスケールが子の方向を崩さないようにするために、親の行列がスケールなしで計算されることを確認します(6)。世界行列は、回転とスケールの翻訳に分解されますが、スケールは行列の計算には使用されず、その後の翻訳に適用されます。

matrix constraint

上記のセットアップは、segmentScaleCompensateがオン(Mayaのデフォルト)になっているジョイントチェーンで完璧に動作します。 この設定をオフにしても動作しますが、計算が少し異なります。 私は現在、逆のスケールを計算して子ジョイントのoffsetParentMatrixに差し込むことで、この設定を少しごまかしていますが、また時間ができたら、同じ設定に数学を実装して、トランスレート・ローテート・スケールを出力するだけにしてみます。

matrix constraint segment scaling

これらのセットアップをより深く知りたい方は、こちらのファイルをご覧ください: Matrix Constraint Matrix Constraint Segment Scale off