c++ - 计算第三人称摄像机的位置

标签 c++ opengl vector camera opengl-3

我最近一直在学习 LearnOpenGL 教程,包括它们的光照部分。以前,对于面向图形的数学类(class),我已经将月球着陆器制作成 2D 物理学,现在我正在尝试将其转换为 3D。虽然物理本身进展顺利,但我正在为相机而苦苦挣扎。起初它只是一个相机悬停在物体后面并跟随它,这很容易做到。但现在我正在尝试根据鼠标输入实现旋转,但我就是不能让它看起来很好。

我想要的是像任何现代 3D 游戏中一样的普通第三人称视角。我目前只尝试根据偏航(鼠标输入提供的 xoffset)设置 X 和 Z 位置。我的 View 矩阵是这样计算的:

glm::lookAt(cameraPosition, focusTarget, cameraUp);

我的焦点目标只是当前 cameraPosition 和父对象位置(相机应遵循的位置)之间的归一化 vector 。上 vector 是右 vector 和目标 vector 的归一化叉积,右 vector 是目标 vector 和世界上 vector (0.0f, 1.0f, 0.0f)的归一化叉积。

我这样计算相机的位置:

glm::vec4 cp;
cp.x = hoverRadius * sin(glm::radians(yaw));
cp.z = hoverRadius * cos(glm::radians(yaw));

cameraPosition = glm::vec3(parentPosition->x + cp.x, parentPosition->y + 3.0f, parentPosition->z + cp.z + 20.0f);

对我来说,基于正弦和余弦的 x 和 z 值是有意义的,使用偏航角作为角度,但是当我左右滑动鼠标时,结果最终看起来像这样:

https://zippy.gfycat.com/TediousElementaryBarnswallow.webm

显然,这不是我想要的。首先,因为与球体的距离不会保持不变,其次,因为它在球体后面的椭圆形轨道上运行,而不是围绕它运行。

那么,有人知道如何解决这个问题吗?或者,有人可以指出可以帮助我编写功能性第三人称相机的资源/教程吗?我已经尝试用谷歌搜索这个数小时了,但我自己没能找到什么,但我也不知道该用谷歌搜索什么。

此外,如果您需要有关我的代码的更多详细信息,我很乐意提供完整的相机代码(主要基于 LearnOpenGL 相机类)。

最佳答案

它看起来像某处,相机矩阵在 X 轴上缩放,你确定某处没有 glm::scale,也许是顶点着色器中的乘法?

此外,您知道可以在 vector 或位置上使用 glm::rotateglm::translate 而不是手动计算余弦和角度吗? glm 中也有很多重载运算符,可以帮助您提高代码的可读性,例如:

glm::vec3 offset(0, 3, 20);
glm::vec3 cp = glm::rotate(glm::vec3(0, 0, hoverRadius), yaw, glm::vec3(0, 1, 0));

cameraPosition = parentPosition + cp + offset;

(我不确定这段代码是否完全有效,我没有测试它,但从内存中,它应该大致做你所做的)

关于c++ - 计算第三人称摄像机的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37364776/

相关文章:

C++ vector 迭代器 : Compare and Erase Two Elements

c++ - Typedef 更改行为导致错误和警告

c++ - 另一个问题 : Passing argument by reference

java - OpenGL 中的编码迷宫

c++ - 屏幕坐标到世界坐标

C++:奇怪的 vector 行为

c++ - 从只读内存中读取结构

c++ - 使用 Catch2Farmework 测试我的功能时出现问题

opengl - 纹理(...)通过textureoffset(...)在glsl中的性能

C++ STL vector 占用过多内存