小编bla*_*iro的帖子

基于四元数的第一人称视角相机

我一直在按照位于https://paroj.github.io/gltut/的教程学习 OpenGL 。

通过基础知识后,我在理解四元数及其与空间方向和变换的关系方面遇到了一些困难,特别是从世界空间到相机空间,反之亦然。在“相机相对方向”一章中,作者制作了一个相机,它在世界空间中相对于相机方向旋转模型。引用:

我们想要应用方向偏移 (R),它在相机空间中获取点。如果我们想将其应用于相机矩阵,只需将其乘以相机矩阵:R * C * O * p。这很好,但我们想要将变换应​​用于 O,而不是 C。

我未经教育的猜测是,如果我们将偏移应用于相机空间,我们将获得第一人称相机。它是否正确?相反,偏移会应用于世界空间中的模型,使飞船相对于该空间而不是相机空间旋转。我们只是从相机空间观察它旋转。

至少受到对四元数的一些理解的启发(或者我是这么认为的),我尝试实现第一人称相机。它有两个属性:

struct Camera{ 
  glm::vec3 position; // Position in world space.
  glm::quat orientation; // Orientation in world space.
}
Run Code Online (Sandbox Code Playgroud)

位置会根据键盘操作进行修改,而方向会因鼠标在屏幕上的移动而发生变化。

注意:GLM 重载了*运算符 forglm::quat * glm::vec3和通过四元数旋转向量的关系( 的更紧凑形式v' = qvq^-1

例如,向前移动和向右移动:

glm::vec3 worldOffset;
float scaleFactor = 0.5f;
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
    worldOffset = orientation * (axis_vectors[AxisVector::AXIS_Z_NEG]); // AXIS_Z_NEG = glm::vec3(0, 0, -1) …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glm-math

7
推荐指数
1
解决办法
7232
查看次数

标签 统计

c++ ×1

glm-math ×1

opengl ×1