3. Limit Rotation Constraintとは何をしているのか
Limit Rotation Constraintは、指定した回転軸のEuler角をmin/max範囲に制限するConstraintです。
たとえば、
X: -30° ~ +60°
Y: -10° ~ +10°
Z: 0° ~ 0°
のように設定すれば、そのConstraint評価の中でBoneやObjectの回転を制限できます。
これはFK操作や機械的な回転制限には非常に便利です。
たとえば、
ドアの開閉角度を制限する
レバーの回転範囲を制限する
補助Boneの回しすぎを防ぐ
FK操作時に関節が不自然に曲がらないようにする
といった用途に向いています。
しかし、IK Solver内部でチェーンを解く処理とは別の段階で評価されるため、IK中のBone制限としては期待どおり動かない場合があります。
第4章 この問題は昔から繰り返し質問されている
IK Limit と Limit Rotation Constraint の関係は、最近になって急に出てきた問題ではありません。Blenderユーザーコミュニティでは、少なくとも2010年代半ばから、同じような疑問が繰り返し投稿されています。
たとえば、次のような質問です。
IKを使うと、Limit Rotation Constraintが期待どおり効かない
IKチェーン内のBoneに回転制限を付けたい
通常のBone ConstraintでIK中のBoneを制限できない
Bone Properties側のIK Limitと、Bone Constraints側のLimit Rotationはどう使い分けるべきか
Pole Targetを使うと、IK Limitや回転制限の挙動が分かりにくくなる
Blender Artistsでは、2015年時点で「IK constrained bone の回転をどう制限するか」という質問がありました。この議論では、IKで制御されるBoneの回転制限には、通常のLimit Rotation Constraintではなく、Bone Data側の built-in IK limits を使う必要がある、という趣旨の説明がされています。
また、Blender StackExchangeにも、IKチェーン内のBoneにEuler角で回転制限をかけたいが、IKが通常のConstraintを期待どおりには尊重しない、という趣旨の質問があります。
さらに、GameDev.tvのフォーラムにも、「IK ignores limit rotation constraint」という、今回の問題をそのまま表したような質問があります。これは、IK制御中のBoneに対してLimit Rotation Constraintを設定しても、期待どおりに効かないことが、実務上の疑問として繰り返し出ていることを示しています。
つまり、この問題は、単なる個別リグの設定ミスとは言い切れません。
むしろ、Blenderにおいて、
IK Solver
Bone > IK > Limit X/Y/Z
Bone Constraints > Limit Rotation
Pole Target
Constraint Stack
Euler回転
が、それぞれ別の仕組みとして存在しているため、ユーザーから見ると非常に分かりにくい構造になっている、と考えた方が自然です。
この背景を知っておくと、IK Limit の値を Limit Rotation Constraint に単純コピーしてもうまくいかない理由が理解しやすくなります。
つまり、問題の本質は、
IK Limitの数値をLimit Rotationへどう換算するか
だけではありません。
より本質的には、
IK Solver内部で使われる関節制限と、
通常Constraintとして評価されるEuler角制限が、
Blender内部で同じ制御体系として統合されていない
という点にあります。
そのため、IKチェーンの関節可動域を制御したい場合は、基本的には Bone > IK > Limit X/Y/Z を使い、FK操作や補助Boneの回転制限には Limit Rotation Constraint を使う、というように用途を分けて考える必要があります。
5. なぜIK LimitをLimit Rotationへ単純コピーできないのか
最初に考えやすい方法は、IK Limitの値をLimit Rotationへそのままコピーすることです。
たとえば、
IK Min X = -30°
IK Max X = +40°
なら、
Limit Rotation min_x = -30°
Limit Rotation max_x = +40°
としたくなります。
しかし、この方法ではうまくいきません。
理由は、前述したようにIK LimitとLimit Rotationが同じ角度空間ではないためです。
IK Limitは、IK Solverが現在のTarget / Pole条件のもとでチェーン全体を解くときの制限です。
Limit Rotationは、最終的なEuler角をmin/maxで制限するConstraintです。
つまり、
IK Limitの -30°
=
Limit Rotationの -30°
とはなりません。
特に、次のような要素が入るとズレやすくなります。
Bone Roll
Owner Space
Euler Order
親Boneの回転
Pole Target
Constraint Stack
IKチェーン内でのBone位置


コメントを残す