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

Cropped d4cd7ac1381dc72b731d1c4cdf542dd3.png

6. 「現在角度C」を使った変換式も完全ではない

IK Limitの値をLimit Rotationへ変換しようとすると、現在のIK姿勢におけるBone角度、つまり現在角度Cを基準にする考え方が出てきます。

考え方としては、次のようになります。

Limit Rotation候補値
= 現在角度C + IK Limit値

たとえば、現在角度Cから見て、IK Min側・IK Max側へどれだけ動けるかを考え、その結果をLimit Rotationのmin/maxに置き換える、という発想です。

この考え方自体は不自然ではありません。
特に、Bone > Inverse Kinematics > Limit X/Y/Z の設定範囲が、Min側は -180°〜0°、Max側は 0°〜180°であり、Limit Rotation Constraint側では min/max ともに -360°〜360°まで設定できることを考えると、現在角度Cを基準にしてLimit Rotation側の絶対角度へ展開する必要がある、という見方は理解しやすいです。

しかし、この方法も完全な変換式にはなりません。

理由は、現在角度Cそのものが、既存のLimit Rotation Constraint、Constraint Stack、Owner Space、Bone Roll、親Boneの姿勢などの影響を受けるためです。さらに、IK SolverはTargetやPole Boneを使ってチェーン全体を解くため、選択Bone単体のEuler角だけを見ても、IK Limitの可動域を完全に再現できるとは限りません。

そのため、C基準の式は、Limit Rotation値を推定するための参考にはなりますが、IK LimitとLimit Rotationを一対一で変換する汎用式としては不十分です。


7. factor = 1.0 でも factor = 2.0 でも完全ではない

角度に加えてFactorを導入すればどうかも検討しました.

IK Limitの入力範囲は概ね、

Min: 0 ~ -180°
Max: 0 ~ +180°

です。

一方、Limit Rotation Constraintのmin/maxは、

-360° ~ +360°

まで扱えます。

このため、単純に考えると、

factor = 2.0

として、IK側の±180°をLimit Rotation側の±360°へ対応させたくなります。

しかし、これも常に正しいとは限りません。

たとえば、小さな角度範囲では、

IK Min = -30°
IK Max = +40°

を2倍してしまうと、

-60° ~ +80°

になり、目視調整したIK可動域より広くなってしまう可能性があります。

一方で、極端な例として、

IK Min = -180°
IK Max = +180°

を考えると、factor = 1.0 ではLimit Rotation側は、

-180° ~ +180°

になります。

しかしEuler角では、-180°と+180°は同じ向きを表す境界でもあるため、この値をそのまま「正しい」と評価するのは危険です。

つまり、

factor = 1.0 が常に正しいわけではない
factor = 2.0 が常に正しいわけでもない

ということです。この考えもあまり良くないようです.

なんとか自動計算で,Bone > Inverse Kinematics > Limit X/Y/Z の値(可動範囲)を制御範囲となるLimit Rotation Constraint>limit X/Y/zに変換する方法を模索しましたが,いまのところ実現はできませんでした.

当面は,各関節に対して最初にBone > Inverse Kinematics > Limit X/Y/Z の値(可動範囲)を設定し,その範囲はsolid画面で可視化されるので,それを頼りにして,Limit Rotation Constraint>limit X/Y/zの制御範囲をマニュアルで決めていくしかなさそうです.


8. なぜBlenderは2つの制限を分けているのか

なぜBlenderは、IK LimitとLimit Rotationを統合していないのでしょうか。

推測ですが、理由は用途が違うからです。

IK Solverは、Targetに到達するためにチェーン全体を解くシステムです。
Limit Rotationは、個別BoneやObjectのEuler角を制限するConstraintです。

両者を完全に統合しようとすると、IK Solverは次のような条件を同時に解く必要があります。

Targetに届くこと
Pole方向を維持すること
各BoneのIK Limitを守ること
各BoneのLimit Rotationも守ること
親Bone変換を考慮すること
Owner Spaceを考慮すること
Euler回転順序を考慮すること
既存リグとの互換性を壊さないこと

これはかなり複雑です。

そのため、Blenderでは実装上、IK内部の関節制限と通常Constraintの回転制限を分けていると考えられます。


コメント

コメントを残す

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

CAPTCHA