【发布时间】:2013-04-17 17:00:16
【问题描述】:
我在 OpenGL 引擎中使用四元数进行旋转。目前,为了为 x、y 和 z 旋转创建旋转矩阵,我为每个轴旋转创建一个四元数。然后我将它们相乘以获得最终的四元数:
void RotateTo3(const float xr ,const float yr ,const float zr){
quat qRotX=angleAxis(xr, X_AXIS);
quat qRotY=angleAxis(yr, Y_AXIS);
quat qRotZ=angleAxis(zr, Z_AXIS);
quat resQuat=normalize(qRotX * qRotY * qRotZ);
resQuat=normalize(resQuat);
_rotMatrix= mat4_cast(resQuat);
}
现在一切都很好,但我只想从所有 3 个轴角度创建一个四元数并跳过最后的乘法。其中一个 quat 构造函数具有欧拉角向量的参数,如下所示:
quat resQuat(vec3(yr,xr,zr))
所以如果我尝试这个最终旋转是错误的。(也尝试过 quat(vec3(xr,yr,zr)) )。GLM 中没有办法在一个实例中从所有 3 个轴填充最终四元数?
现在,还有一件事: 正如 Nicol Bolas 建议的那样,我可以使用 glm::eulerAngleYXZ() 立即填充旋转矩阵,因为他认为执行中间四元数步骤是没有意义的。但我发现该函数无法正常工作,至少对我来说。例如:
这个:
mat4 ex= eulerAngleX(radians(xr));
mat4 ey= eulerAngleY(radians(yr));
mat4 ez= eulerAngleZ(radians(zr));
rotMatrix= ex * ey * ez;
返回的结果与此不同:
rotMatrix= eulerAngleYXZ(radians(yr),radians(xr),radians(zr));
从我对正确旋转状态的比较来看,第一种方式给出了正确的旋转,而第二种方式是错误的。
【问题讨论】:
标签: math opengl quaternions