C++ OpenGL/GLSL/GLM-Skybox旋转时就像是第三人称

C++ OpenGL/GLSL/GLM-Skybox旋转时就像是第三人称,c++,opengl,glsl,glm-math,C++,Opengl,Glsl,Glm Math,我刚刚开始实现Skybox,并将OpenGL/GLSL和GLM作为我的数学库。我假设问题与矩阵相关,我还没有找到一个利用GLM库的实现: skybox的模型可以很好地加载,但是相机会围绕它旋转,就像在3d第三人称相机中绕着它旋转一样 对于我的skybox矩阵,我会在每次相机更新时更新它。因为我使用glm::lookAt,所以它的创建方式基本上与我的视图矩阵相同,只是我使用0,0,0作为方向 这是我的视图矩阵创建。它在渲染对象和几何体时工作良好: direction = glm::vec3(cos

我刚刚开始实现Skybox,并将OpenGL/GLSL和GLM作为我的数学库。我假设问题与矩阵相关,我还没有找到一个利用GLM库的实现:

skybox的模型可以很好地加载,但是相机会围绕它旋转,就像在3d第三人称相机中绕着它旋转一样

对于我的skybox矩阵,我会在每次相机更新时更新它。因为我使用glm::lookAt,所以它的创建方式基本上与我的视图矩阵相同,只是我使用0,0,0作为方向

这是我的视图矩阵创建。它在渲染对象和几何体时工作良好:

direction = glm::vec3(cos(anglePitch) * sin(angleYaw), sin(anglePitch), cos(anglePitch) * cos(angleYaw));
right = glm::vec3(sin(angleYaw - 3.14f/2.0f), 0, cos(angleYaw - 3.14f/2.0f));
up = glm::cross(right, direction);
glm::mat4 viewMatrix = glm::lookAt(position, position+direction, up);
同样,我的天空矩阵也是以相同的方式创建的,只需一个更改:

glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f);
glm::mat4 skyView = glm::lookAt(position, position + direction, up);
我知道skybox不应用平移,只考虑旋转,所以我不确定问题是什么。有没有更简单的方法

视觉教具:

一直往前走,没有任何动静

当我旋转相机时:


我的问题是:如何使用glm:lookAt设置渲染skybox的正确矩阵?

唯美主义者是正确的skybox/skydome是唯一一个表示不更改投影矩阵的对象

您的渲染应该如下所示:

  • 清除屏幕/缓冲区
  • 设置摄像机
  • 将modelview设置为identity,然后将其转换为摄影机的位置。您可以直接从投影矩阵(如果我的内存用于阵列位置12、13、14)获取位置,以获取矩阵,请参见此
  • 绘制skybox/skydome(不要穿过z_远平面,或禁用深度测试)
  • 可选清除Z缓冲区或重新启用深度测试
  • 画你的场景斯图夫。。。。(不要忘记为每个抽屉模型设置modelview矩阵)
  • 当然,您可以将相机位置(投影矩阵)临时设置为(0,0,0),并将modelview矩阵保留为identity,这有时是更精确的方法,但不要忘记在绘制skybox后将相机位置设置回原来的位置


    希望能有帮助。

    不过,相机在3d第三人称相机中绕着它旋转-我很难想象你的意思,也许一个图像或一个简短的youtube剪辑会有所帮助?你确定圆顶围绕(0,0,0)旋转吗?看起来顶点可能偏离中心。我想我的问题是:如何设置矩阵以使用glm::lookAt渲染天空?skybox不只是一个具有自己变换矩阵的对象吗?我不知道lookAt会在哪里使用?Satchmo,你能把你的skybox模型的源数据添加到问题中吗?我认为这与答案有关。