我最近一直在关注LearnOpenGL教程,包括他们的照明部分。以前,对于以图形为导向的数学课程,我已经将Lunar Lander视为2D中的物理,现在我正在尝试将其转换为3D。虽然物理本身很顺利,但我正在挣扎着相机。起初它只是一个悬停在物体后面的摄像机并跟随它,这很简单。但是现在我正在尝试基于鼠标输入实现旋转,我只是不能让它看起来很好。
我想要的是像任何现代3D游戏一样的普通第三人称相机。我目前只是尝试根据偏航设置X和Z位置(xoffset由鼠标输入提供)。我的视图矩阵计算如下:
glm::lookAt(cameraPosition, focusTarget, cameraUp);
我的焦点目标只是当前cameraPosition和父对象(摄像机应该遵循的位置)之间的归一化向量。向上矢量是右矢量和目标矢量的归一化叉积,右矢量是目标矢量和世界上矢量的归一化叉积(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相机类)。
答案 0 :(得分:0)
看起来像某个地方,相机矩阵在X轴上缩放,你确定某个地方没有glm :: scale,可能是顶点着色器中的乘法吗?
另外,您是否知道可以在矢量或位置上使用glm::rotate
和glm::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;
(我不确定这段代码是否完全有效,我没有测试过,但是从记忆中来看,它应该近似地做你所做的事情)