0

我试图找到一个我已经计算了旋转矩阵的对象的右向量,以便它可以在 3d 空间中扫射。到目前为止,我已经得到

    glm::quat gOrientation2 = glm::quat(glm::radians(entity.orientation));
    glm::mat4 RotationMatrix = glm::mat4_cast(gOrientation2);
    entup = glm::vec3(RotationMatrix[1][0], RotationMatrix[1][1], RotationMatrix[1][2]);
    entforward = glm::vec3(RotationMatrix[2][0], RotationMatrix[2][1], RotationMatrix[2][2]);
    entright = glm::vec3(RotationMatrix[0][0], RotationMatrix[0][1], RotationMatrix[0][2]) ;    

在盯着它看了一会儿之后,我发布了它左右移动的处理程序,思考问题是否真的存在于那里。

//the (10, -10, 10) vec3 is just a generic speed that moves 
//it forward then multiplied by dir.
if (glfwGetKey(65) == GLFW_PRESS){
    if(entity.player == 1)
        entity.position += glm::vec3(10,-10,10)*entright*deltaTime;
}
if (glfwGetKey(68) == GLFW_PRESS){
    if(entity.player == 1)
        entity.position -= glm::vec3(10,-10,10)*entright*deltaTime;
}

只要我只俯仰和偏航,这一直工作得很好。一旦物体试图滚动,它的右矢量就会与它应该的位置成 90 度角。我知道我可以提取 RotationMatrix 的第一行来获取 Right,但这与上述代码的结果相同。

图片说明问题 http://img442.imageshack.us/img442/5046/directionexample.jpg

4

1 回答 1

0

您将四元数相乘的顺序令人困惑。尝试改变

glm::quat gOrientation2 = rY*rX*rZ;

glm::quat gOrientation2 = (rX*rY)*rZ

正如您所说,做叉积没有意义;直接从旋转矩阵中获取正确的向量。

这不是使用 glm 将欧拉角转换为四元数然后是旋转矩阵的最有效或最简洁的方法。glm 为此内置了函数;检查文档。

于 2013-04-16T18:33:18.470 回答