この質問を解決するために、ソースポーズの各ジョイントの絶対(ワールドスペース)方向を(正規化された単位ベクトルとして)把握し、ターゲットのジョイントを回転させてその方向に合わせることにしました。問題は、ボーン(ジョイントからその子へのベクトル)がワールド空間で指定された方向になるように回転クォータニオンを計算する方法です。
更新:これが私の現在の考えです。ボーンごとに、変換行列は次のようになります。
(1) absolute transform = local rotation * relative transform to parent in bind pose * parent absolute trasform
したがって、3つの関節があるとします:肩->肘->手首。肩の絶対変換が既にあり、肘->手首がソースアニメーションと同じ方向になるように肘の回転を計算しようとしています。(1)から、絶対変換は次のようになります。
(2) ELBOW absolute = ELBOW local * SHOULDER to ELBOW relative * SHOULDER absolute
(3) WRIST absolute = WRIST local * ELBOW to WRIST relative * ELBOW absolute
代入すると、次のようになります。
(4) WRIST absolute = WRIST local * ELBOW to WRIST relative * ELBOW local *
SHOULDER to ELBOW relative * SHOULDER absolute
:私たちの定数であるELBOW to WRIST relative
、SHOULDER to ELBOW relative
とSHOULDER absolute
。WRIST local
回転のみで構成され、移動/スケールはありません。問題は、ELBOW local
そのような値を見つけることです...
(5) normalize(position(ELBOW absolute) - position(WRIST absolute)) = desired direction
(6) ELBOW local consists only of rotations (no translation/scale)
ボーンの長さと目的の方向がわかっているので、の位置部分を推定することは可能ですWRIST absolute
が、回転は不明になります(この問題はAFAICTを再帰的に実行することは不可能のようです)。
私の最初の考えは、WRIST local
回転のみであり、ループの次の反復で解決するため、の計算では完全に無視できるということでしたELBOW local
。以下のスティーブンスタドニツキの回答は、骨の向きがスキニングにとって重要であるため、それほど簡単ではない可能性があることを示唆しています。ただし、これをスティックフィギュアで機能させることができれば、後でその橋を渡ることができます。
M = inv(childRelative) * childAbsolute * inv(parentAbsolute) * inv(selfRelative)
か?そのような行列方程式のように?selfRelativeおよびchildRelativeマトリックスとは何ですか?変換チェーンを行う通常の方法は次のとおりです:childTransform = parentToChild * parentTransform。他のマトリックスは、それらの目的が何であるかについてはそれほど明白ではありません。問題は興味深いものであり、謎を解くにはうねりかもしれません:)。
elbow_local
され、非線形になりますが、8 ..は、未知数が8つの4つの方程式です。自由度が少ない運動連鎖を使用することを検討してください。あなたはを聞いたことがありDenavit-Hartenbergのが慣例?私はそれをかなりまともな結果で使用しました