このメモは個人的な蓄積のためのものであり、説明は専門的ではありません。間違いがあれば修正してください
序文
3 点 IK スケルトンのプロポーショナル ストレッチの実現では、前のセクション [Maya バインディング] で3 点 IK ジョイントのストレッチを実現しました。IK ジョイントのコントローラは 1 つだけです (手首には親コンストレイントが表示されます)。そのため、ストレッチ エフェクトを実現するために各ボーンの長さを計算しました。
FK ジョイントは 3 セグメント コントローラーをストレッチし、3 セグメント コントローラーの変換ノード内のローカル変換マトリックス Matrix はコントローラー自身の変換情報を記録するため、各セグメントのボーンの長さを計算する必要はありません。
- コントローラーの移動方法
親コントローラーのロケーター** (ロケーターには回転の変更は含まれません)** を使用して、サブジョイントの位置を特定し、そのマトリックスをサブジョイントに渡します。コントローラーは、parentOffsetMatrix
関節のプロセス中に引き伸ばされ、ロケーターが移動し、コントローラーはその動きに追従しますが、明示的な変換には影響しません。
parentOffsetMatrix
これは、maya2020 の新機能であり、暗黙的な変換です。 - なぜ特別な FK ストレッチ メカニズムを作成する必要があるのでしょうか
? コントローラーはペアレント コンストレイントを使用してドリブンの位置を変更できるのに、この一見無意味なアクションをなぜ追加するのでしょうか。
説明の便宜上、2 つの例を見ることができます:
ケース 1: コントローラーを直接使用してストレッチする、
ケース 2: 増加したアトリビュート ストレッチ スケール ファクターを使用する:
これら 2 つの例の違いは、コントローラーがゼロ状態のままかどうかです。コントローラーがジョイントに追加されているが、ジョイントの位置を変更したい場合、通常の考え方は、ジョイントを予想される位置に移動し、コントローラーからコンストレイントを解放し、コントローラーをフリーズして、再度コンストレイントすることです。2 番目のケースは、このような状況を効果的に回避し、異なる縮尺モデルの再利用を実現できます。前のセクションの目的についても同じことが言えます。
ジョイントとそのコントローラー階層
↑上のアウトラインで選択されたコンテンツは、ジョイントとそのロケーターを示しています。ジョイントのロケータは、親ジョイントに対するサブジョイントの相対位置を特定するため、ロケータに“关节名称_OFF_LOC”
サブジョイントの相対位置を表す名前を付けます (元の 2 つのボーンの長さは L1、L2 であることに注意してください)。
↑上記概要で選択した内容 コントローラーの上下関係とは。コントローラーと関節は点拘束関係にありますが、ノードエディターでコントローラーの回転を関節の回転に結び付けます。これは、関節が原則としてコントローラに従って移動および回転されることを意味します。
擬似コードの実装
# stretch the bone
shoulder_FK.scaleX = shoulder_FK_CTRL.stretch * shoulder_FK.scaleX
elbow_FK.scaleX = elbow_FK_CTRL.stretch * elbow_FK.scaleX
# translate the off_loc
shoulder_FK_OFF_LOC.transX = shoulder_FK_CTRL.stretch * L1 # at elbow
elow_FK_OFF_LOC.transX = elbow_FK_CTRL.stretch * L2 # at wrist
# fill the parentOffsetMatrix of the Ctrl
elbow_CTRL.parentOffsetMatrix=shoulder_FK_OFF_LOC.matrix
wrist_CTRL.parentOffsetMatrix=elbow_FK_OFF_LOC.matrix
利用可能なノード:multDoubleLinear