我在 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));
从我对正确旋转状态的比较来看,第一种方式给出了正确的旋转,而第二种方式是错误的。