什么是限制3D旋转(使用欧拉角和/或四元数)的正确/最佳方法?
看起来我的做法有些问题。我将旋转应用于动画骨架层次结构中的骨骼,有时骨骼会明显地“跳”到错误的方向,并且各个欧拉组件会绕到其范围的另一端。
我使用欧拉角表示当前方向,将其转换为四元数进行旋转,并独立夹紧每个欧拉角轴。以下是C++伪代码,基本上展示了我正在做的事情:
看起来我的做法有些问题。我将旋转应用于动画骨架层次结构中的骨骼,有时骨骼会明显地“跳”到错误的方向,并且各个欧拉组件会绕到其范围的另一端。
我使用欧拉角表示当前方向,将其转换为四元数进行旋转,并独立夹紧每个欧拉角轴。以下是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]);