Back to Overview

rig placement

Tools & Techart Topics

久しぶりに自分のウェブサイトに何か投稿しようと思い、RNDフォルダを探っていたところ、この設定を再び発見し、他の人の役に立つかもしれないので、公開することにしました。

プレーサーリグ

この設定の背後にあるアイデアは、スキニング後にリグを変更できるだけでなく、スクリプトを使用せずに(モジュラー)自動リグ設定を作成する方法であることです。これは、最終的なリグのコントロールとジョイントの位置を提供するシンプルなコントロールである、プレーサーリグを使用します。コントロールが配置されると、リグ自体がメッシュのコントロールを引き継ぐことができます。ユーザーは、配置コントロールを削除したり、アニメーターがセットアップを壊せないようにロックしたりすることができるようになるでしょう。また、prebindmatrixの情報をskinclusterにパイプできるので、セットアップを確定する前に、スキニングでより良い結果を得るためにジョイント配置を修正する方法があります。唯一の注意点は、skinclusterのinverseMatrixからprebindMatrixへの接続を解除しても、情報が保存されていないので、正しく動作させるには、いくつかのスクリプトが必要になる点です。

このセットアップでは、基本的なジョイント配置の原則をいくつか取り入れ、ベクトル数学のノードを使用して、スケルトンとリグを動かすマトリクスを作成します。

分解位置

説明を簡単にするために、リグの左側についてだけ説明します。右側もほとんど同じです(最後の画像は、右側のコントロールのミラーリングセットアップを作成する方法を示しています)。 アームは、3つの配置コントロール(1)で構成されています。これらのコントロールは、シーン内の必要な場所に配置でき、その位置が配置設定を駆動します。どのような環境でも動作するようにするには、ワールドマトリクスを分解して、そこから位置を取得することができますが、この場合は、コントロールの位置で十分に動作します。 空間内の 3 つの位置で、平面と法線 (2) を作成できます。基本的なベクトル数学を使って、次の位置のベクトルを見つけます。肩と肘の位置が決まれば、これを使用して、クロス積を使用して法線を導き出すことができます。(このセットアップでは、プラッサーが正確に並んでいるかどうかは考慮されません。前述のように、三角形/平面を作成するためには、少なくともその位置にわずかな違いがある必要があります) 肩と肘の pointAt と法線が得られたので、これを使って回転行列を作成しますが、これらの要素のクロス積を使用して、3 つのベクトルを合わせて行列 (3) を作成すると、手首は肘と同じ向きになり、手首プレーサーの位置が取得されます。

これで、空間内の3つの位置が、関節とコントロールの正しい位置と向きを持つ3つの行列に変換されました。これらの位置はすべてワールドスペースにあり、コントロールとジョイントはすべてローカルスペースにあります。ここからはズルをして inheritsTransform 属性をオフにすると、駆動オブジェクトの親空間の計算をすべて無視できますが、私は主にゲーム用のリグを扱っているので、この贅沢はリグのエクスポート時に解決するよりも多くの問題が発生する傾向があります。

局所空間計算

肩の場合、腕は接続されていないので、分解されたセットアップの translate と rotate から直接接続することにしました。 この場合、肘の関節の向きを固定するだけです(4)。基本的には上記の行列の計算と同じですが、必要な要素だけで作業するために、四元数を使用するアプローチを選択しました。四元数Prodを使用して、子の世界空間の四元数と親の逆四元数を組み合わせてローカル四元数を取得します。これをオイラー空間に戻し、関節の向きに直接つなげます。 手首は固定する必要はありません。rotateとjoint orientで0回転を取るので、これは簡単です。

ここから先の他の接続は、リグを意図したとおりに動作させるためのものです。プレーサーは、各コントロールのオフセットに関する情報も制御するので、コントロール自体はどの位置でもきれいになるはずです。ここから、スキンクラスタの駆動方法を見ることができます。

プリバインド情報の駆動

スキンクラスターは、メッシュを変形させるために骨の世界空間行列情報を使用します。スキンクラスターが、外部の影響によってそれらがどのように移動するかを知るために、各頂点の元の位置を特定する元のメッシュ(origShape)を必要とするのと同様に、ジョイントも元の位置が必要です。 この情報は、スキンク ラスターの bindPreMatrix 属性にあります(6)。この属性はマトリックスの配列で、メッシュがバインドされるときにスキンク ラスターに設定されます。prebind マトリックスのインデックスは、マトリクス属性内のジョイントのインデックスに対応するので、オブジェクトを接続するときには注意してください。(3) で始めたセットアップは、実際には世界空間の情報を持っており、prebindmatrix は worldInverseMatrix を使用しているので、skincluster にパイプする前に情報を反転させる (5) ことだけが必要なのです。 前述したように、これによってスキンクラスタを変形させることなくスケルトンを修正することができますが、もし接続が切れると、行列情報が保存されていないため、デフォルトの情報にジャンプバックします。これを動作させるには、スキンクラスタに逆行列をコードでセットする必要があります。

鏡面

これは、右側が左側と自動的に一致し、キャラクターが非対称の場合は右側を動かすことができるため、配置のスピードアップに役立ちます。 現在、セットアップでは nurbsPlane (8) を使用しており、そこからマトリックスを乗算 (9) して、オフセットグループ (10) をミラーリングした位置に配置しています。 選択ノード (7) は、ユーザーが正しいミラー軸を選択できるようにするためにあります。最初の3つのオプションはデフォルトのワールドスペースミラーセットアップで、最後のものは平面の情報を取得します。

この設定についてもっと詳しく知りたい場合は、このファイルを参照してください。 Maya 2019 ファイル

Navigated to Perry LeijtenTechnical Artist