从旋转和位置获取前向向量

tom*_*une 2 c++ opengl glm-math

我有一个相机类,它具有旋转和位置以及从位置和旋转生成视图矩阵的方法,相机将视图矩阵发送到渲染器蚀刻帧。(投影矩阵相同,但变化不大)。

class Renderer;
class Camera
{
    Renderer& m_renderer;
    glm::mat4 GetViewMatrix();
public:
    glm::vec3 position;
    glm::vec3 rotation;
    float Fov;

    Camera(Renderer& renderer,float Fov, int width , int height);
    void MoveCamera(glm::vec3 direction);
    void RotateCamera(glm::vec3 direction);
    void Update();
};
Run Code Online (Sandbox Code Playgroud)

我想要做的是调用“MoveCamera”:

void Camera::MoveCamera(glm::vec3 direction)
{
    this->position += direction;
}
Run Code Online (Sandbox Code Playgroud)

forwardDirection*deltaTime*speed 从我的主循环。我的问题是从我的旋转和位置创建一个前向矢量。旋转是一个带有度数的向量3,用于创建这样的视图矩阵:

glm::mat4 Camera::GetViewMatrix()
{
    glm::mat4 matRoll = glm::mat4(1.0f);
    glm::mat4 matPitch = glm::mat4(1.0f);
    glm::mat4 matYaw = glm::mat4(1.0f);
    matRoll = glm::rotate(matRoll,glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f));
    matPitch = glm::rotate(matPitch, glm::radians(rotation.x), glm::vec3(0.0f, 1.0f, 0.0f));
    matYaw = glm::rotate(matYaw, glm::radians(rotation.y), glm::vec3(1.0f, 0.0f, 0.0f));
    glm::mat4 rotate = matRoll * matPitch * matYaw;
    glm::mat4 translate = glm::mat4(1.0f);
    translate = glm::translate(translate ,-position);
    return   rotate*translate ;
}
Run Code Online (Sandbox Code Playgroud)

那么在这种情况下我应该如何从我的位置和旋转中制作一个前向矢量?

小智 6

您可以从相机视图矩阵中提取它。

在世界空间中拥有相机变换矩阵后,您可以将其反转以获得视图矩阵

您正在使用使用列主矩阵的glm,因此您只需抓取倒置矩阵的第二列并将其归一化以获得方向。

const mat4 inverted = glm::inverse(transformationMatrix);
const vec3 forward = normalize(glm::vec3(inverted[2]));
Run Code Online (Sandbox Code Playgroud)