约束 3D 旋转的正确/最佳方法是什么(使用欧拉角和/或四元数)?
看来我的做法有问题。我将旋转应用于骨骼层次结构中的骨骼以进行动画处理,并且骨骼有时会明显地“跳”到错误的方向,并且各个 Euler 组件会环绕到其范围的另一端。
我使用欧拉角来表示当前方向,转换为四元数进行旋转,并独立夹紧每个欧拉角轴。这是 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]);