3D 回転を制限する正しい/最良の方法は何ですか (オイラー角やクォータニオンを使用)?
どうやら私のやり方が間違っているようです。アニメーション用に骨格階層のボーンに回転を適用しています。ボーンが間違った方向に「ジャンプ」することがあり、個々のオイラー コンポーネントが範囲の反対側に回り込んでいます。
オイラー角を使用して現在の向きを表し、クォータニオンに変換して回転を行い、各オイラー角軸を個別にクランプします。基本的に私がやっていることを示す C++ 擬似コードは次のとおりです。
Euler min = ...;
Euler max = ...;
Quat rotation = ...;
Euler eCurrent = ...;
// do rotation
Quat qCurrent = eCurrent.toQuat();
qCurrent = qCurrent * rotation;
eCurrent = qCurrent.toEuler();
// constrain
for (unsigned int i = 0; i < 3; i++)
eCurrent[i] = clamp(eCurrent[i], min[i], max[i]);