我刚刚开始实现天空盒,并且使用OpenGL/GLSL和GLM作为我的数学库来实现。我认为问题与矩阵有关,并且我无法找到利用GLM库的实现:

天空盒的模型可以很好地加载,但是相机会对其进行环绕,就像它在3d第三人称相机中围绕它旋转一样。

对于我的Skybox矩阵,每次相机更新时都会对其进行更新。因为我使用glm::lookAt,所以它的创建方式与我的 View 矩阵基本相同,除了我将0、0、0用作方向。

这是我的 View 矩阵创建。它可以很好地渲染对象和几何体:

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设置正确的矩阵以渲染天空盒?

最佳答案

Esthete是正确的skybox/skydome是仅表示不更改投影矩阵的对象!

您的渲染应该是这样的:

  • 清除屏幕/缓冲区
  • 设置相机
  • 将modelview设置为identity,然后将其转换为相机的位置,您可以直接从投影矩阵获取位置(如果我的内存位于数组位置12,13,14)以获取矩阵,请参见https://stackoverflow.com/a/18039707/2521214
  • 绘制skybox/skydome(请勿越过z_far平面或禁用深度测试)
  • 可选y清除Z缓冲区或重新启用深度测试
  • 绘制场景stuf...。(不要忘记为每个绘制的模型设置modelview矩阵)

  • 当然,您可以将摄像机的位置(投影矩阵)临时设置为(0,0,0)并保留带有标识的modelview矩阵,这有时是更精确的方法,但不要忘记在绘制天窗之后重新设置摄像机的位置。

    希望能帮助到你。

    09-06 19:15