如何使用四元数来存储相机的旋转



我正在尝试制作一个"6自由度";像太空游戏中使用的相机。我想学习如何将相机旋转存储为四元数,但我在互联网上找不到任何帮助我的东西(或者我不知道应该使用什么关键词(。

我想做的是使用glm::quat来存储相机的方向,但我遇到的问题是改变俯仰、偏航、滚转,并找出如何获得glm::lookAt函数创建视图矩阵所需的新的向上、向右和方向矢量。

到目前为止,这是我的代码与我需要帮助的功能标记:

#include "camera.hpp"
#include <glad/glad.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/quaternion.hpp>
Camera::Camera(glm::vec3 position, glm::quat orientation, float zNear, float zFar)
{
this->position = position;
this->orientation = orientation;
right     = glm::vec3( 1,  0,  0);
up        = glm::vec3( 0,  1,  0);
direction = glm::vec3( 0,  0, -1);
this->zNear = zNear;
this->zFar = zFar;
updateViewMatrix();
}
Camera::Camera(glm::vec3 position, glm::vec3 orientation, float zNear, float zFar)
{
this->position = position;
this->orientation = glm::quat(glm::vec3(glm::radians(orientation.x), glm::radians(orientation.y), glm::radians(orientation.z)));
right     = glm::vec3( 1,  0,  0);
up        = glm::vec3( 0,  1,  0);
direction = glm::vec3( 0,  0, -1);
this->zNear = zNear;
this->zFar = zFar;
updateViewMatrix();
}
void Camera::setPosition(glm::vec3 position)
{
this->position = position;
}
void Camera::setOrientation(glm::quat orientation)
{
this->orientation = orientation;
}
void Camera::setOrientation(glm::vec3 orientation)
{
glm::quat orientationQuat = glm::quat(orientation);
this->orientation = orientationQuat;
}
void Camera::setPitch(float amount)
{
// NEED HELP
updateViewMatrix();
}
void Camera::setYaw(float amount)
{
// NEED HELP
updateViewMatrix();
}
void Camera::setRoll(float amount)
{
// NEED HELP
updateViewMatrix();
}
void Camera::setZNear(float zNear)
{
this->zNear = zNear;
updateProjectionMatrix();
}
void Camera::setZFar(float zFar)
{
this->zFar = zFar;
updateProjectionMatrix();
}
void Camera::move(glm::vec3 movement)
{
position += right * movement.x + up * movement.y + direction * movement.z;
updateViewMatrix();
}
void Camera::moveAxis(glm::vec3 translation)
{
position += translation;
updateViewMatrix();
}
void Camera::rotate(glm::quat rotation)
{
// NEED HELP
}
void Camera::rotate(glm::vec3 rotation)
{
glm::quat rotationQuat = glm::quat(rotation);
// NEED HELP
}
void Camera::pitch(float amount)
{
// NEED HELP
updateViewMatrix();
}
void Camera::yaw(float amount)
{
// NEED HELP
updateViewMatrix();
}
void Camera::roll(float amount)
{
// NEED HELP
updateViewMatrix();
}
// Excluded a few get___() functions here
glm::mat4 Camera::getViewMatrix() const
{
return viewMatrix;
}
glm::mat4 Camera::getProjectionMatrix() const
{
return projectionMatrix;
}
glm::mat4 Camera::getViewProjectionMatrix() const
{
return viewProjectionMatrix;
}
void Camera::updateViewMatrix()
{
viewMatrix = glm::lookAt(position, position + direction, up/*glm::cross(right, direction)*/);
viewProjectionMatrix = projectionMatrix * viewMatrix;
}

以下是我在头文件中创建的相关变量:

glm::vec3 position;
glm::quat orientation;
glm::vec3 direction; // Camera Direction / Camera View Facing
glm::vec3 right;
glm::vec3 up;

我找到了我的问题的答案"如何找到glm::lookat函数"的右向量、上向量和方向向量;

我现在所需要做的就是通过四元数的方向来改变世界的向上、向右和方向向量,如下所示:

right = glm::normalize(orientation * glm::vec3(1, 0, 0));
up = glm::normalize(orientation * glm::vec3(0, 1, 0));
direction = glm::normalize(orientation * glm::vec3(0, 0, -1));

最新更新