Blender : リギングに必要なBone > IK > Limit x/y/zとBone Constraints > Limit Rotation Limit x/y/zは,なぜ一致しないのか

Cropped d4cd7ac1381dc72b731d1c4cdf542dd3.png

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位置

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA