- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近一直在学习 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::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;
(我不确定这段代码是否完全有效,我没有测试它,但从内存中,它应该大致做你所做的)
关于c++ - 计算第三人称摄像机的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37364776/
我是一名优秀的程序员,十分优秀!