Twist Joint と 補助ジョイント

Twist joint – 曲げと捻りを分けたノード

手首・足首などのを曲げたときに、そのまま捻りを加えて前腕や脹脛が自然と捻られるようなジョイントをつくる。(動画参照)

単にツイスト(捻り)ジョイントを前腕に追加しただけでは、手首を曲げたときにZ回転では捻ることができない。

そこで、手首の回転から「曲げ」の成分を差し引いて「捻り」だけを取り出して使う。

ジョイントの向き(ベクトル)を取得するノード

composeMatrix でMatrixを生成

1つめのcomposeMatrix:ジョイントのX軸+1の座標を取得するため、「入力移動X」を「1」にする。

2つめのcomposeMatrix:ジョイントの「回転」を入力する。

multMatrixノード

multMatrixの入力0に1つめの、入力1に2つめのcomposeMatrixの出力行列を接続する。(2つを乗算することで、Matrixをジョイントの子階層として挙動させる。)

decomposeMatrixノード

multiMatrixから移動成分を抽出するため、 decoomposeMatrix ノードを作成し、計算結果のマトリックスをinputMatrixに接続する。

2つのベクトルから回転角度を計算( Bend 回転の取得)

angleBetweenノードを作成。 decomposeMatrix の「出力移動」を angleBetweenのvector1とvector2につなぎ、vector1の接続を削除することで結果としてベクトルの初期値をvector1に残す。

Bend回転をQuaternion に変換

axisAngleToQuatノードを作成。 Bend回転を取得しているangleBetweenノードからAxisとAngle情報をaxisAngleToQuatに接続し、Quaternionに変換する。

Quaternionを[逆Quarternion] に変換

QuaternionをQuarInvertノードに接続して「逆Quaternion」に変換する。

Hand_Leftの直接の「回転」

 Hand_Leftの直接の「回転」をeulerToQuatに接続してQuarternionに変換する。

quatProdノード

quatProdノードを作成し、Hand_LeftジョイントのQuaternionにBend成分の「逆Quaternion」を掛け算する。

Hand_LeftジョイントのQuaternionからBend成分を差し引くことで、Roll(捻り)回転だけを取得できる。

(➡ Quaternionの加算は乗算で、除算は逆数の乗算で行う。)

Roll回転に係数を乗算して割り振る

Hand_LeftのRoll回転だけを取り出した後、肘にかけて配置した3つのtwist jointにそれぞれ係数を乗じて割り振る。 手首から肘にかけて 1、0.75、0.5、0.25 の係数を乗じることで、前腕の捻り(Roll回転)を表現する。

3つのquarSlerpノード

quatSlerpノードを3つ作成する。 quatProdの出力Quarernionを、作成した各quarSlerpノードの入力クウォータニオン1と2に接続し、その後、入力クウォータニオン1を削除して初期値を入力1に残しておく。

手首の位置に配置したTwist jointには 1を乗じるため、quatSlerpノードは必要ない。

quatSlerp アトリビュート

3つの各quarSlerp ノードのアトリビュートで、[ T ] の値に係数 0.75、0.5、0.25 を入力する。

quatToEulerでクォータイニオンをオイラーに変換

4つの出力quaternion(クォータニオン)を4つのquatToEulerノードを作成し、各入力quaternionにそれぞれ接続する。

quatToEulerで、euler(オイラー)角度に変換した回転出力を、各Twist jointのRotation に接続して完成。

ここまでのすべてのノードの接続

作例

Twist joint に加え、ドリブンキーによる骨格・筋肉の動きを編集し、LowポリゴンのCageモデルにスキニング、ウェイト調整を行った。

更に、Highポリゴンモデルを作成して、Cageモデルのスキンウェイトをコピーして移植。

脚(ケージモデル)

脚(Highメッシュモデル)

腕(ケージモデル)

腕(Highメッシュモデル)

全身 – スキンウェイト 調整

最後に、Highポリゴンモデルのスキンウェイトの微調整を行った結果。 肘、大腿部のウェイトがやや極端に作用していた部分を調整した。