リギングの基本【ジョイント:03】
今回はジョイントのtwist(捻り、Primary Axisなどと呼ばれたりする)だけを回転させる方法と落とし穴を紹介します
シンプルなコネクション
腕の補助骨、arm_Lのtwist(rotateX)の×-0.5回転する「arm_roll_A_L」を作ってみます
expressionで書くと
arm_roll_A_L.rotateX = arm_L.rotateX * -0.5;
になります
補助骨の前提条件として、「値を取得するノード」と「値を渡すノード」は同じ軸にしておきます
この場合は、arm_Lが「値を取得するノード」、arm_roll_A_Lが「値を渡すノード」です
arm_roll_A_Lはarm_Lの子にしておきます
arm_roll_A_Lは回転しているのがわかるようにシェイプを割り当てています

ノードエディタでmultDoubleLinearでarm_L.rotateXからmultDoubleLinear1.input1に接続
input2に-0.5を設定
multDoubleLinear1.outputからarm_roll_A_L.rotateXに接続


挙動を確認してみます

一見うまく動いているように見えますが、若干フリップしていることがわかります
これは「値を取得するノード」にジンバルロックが起きていて、値が飛び飛びになっているためですね
Quaternion変換を使ったコネクション
次に、arm_Lのtwist(rotateX)の×-0.5回転する「arm_roll_B_L」を作ってみます
階層や軸はarm_roll_A_Lと同じにします
画像のようなコネクションでつないでみます
pairBlend.weightに-0.5を設定します

挙動を確認してみます

Quaternion変換を使ったコネクションではフリップが起きていませんね
こっちのほうが安定しそうです
今回はtwistについて紹介しましたが、補助骨のもうひとつの要素として、bend(swing、Secondary Axis、曲げとも呼ばれる)もあります
bendはtwistをもう少し応用すればできるのでよかったら試してみてください
このあたりを全部制御できるノードがMayaのデフォルト機能にいまだに入っていないので、もうそろそろほしいなあ
UnrealEngineにはあるのになあ…と補助骨をつくるときに毎回思う私です
それでは!