4

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

天空盒的模型加载得很好,但是相机会绕着它旋转,就好像它在 3d 第三人称相机中围绕它旋转一样。

对于我的天空盒矩阵,每次我的相机更新时我都会更新它。因为我使用 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);

我知道天空盒不应用平移,只考虑旋转,所以我不确定问题是什么。有没有更简单的方法来做到这一点?

视觉辅助:

还没有任何动静直接上路 当我第一次启动程序时直接

当我旋转相机时: 在此处输入图像描述

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

4

1 回答 1

2

Esthete 是对的 skybox/skydome 是唯一的对象,这意味着您不会更改投影矩阵!

你的渲染应该是这样的:

  1. 清除屏幕/缓冲区
  2. 设置相机
  3. 将模型视图设置为标识,然后将其转换为相机的位置,您可以直接从投影矩阵获取位置(如果我的内存服务于数组位置 12、13、14)以获取矩阵,请参阅此https://stackoverflow.com/a /18039707/2521214
  4. 绘制天空盒/天空穹顶(不要越过你的 z_far 平面,或禁用深度测试)
  5. 可选清除 Z 缓冲区或重新启用深度测试
  6. 绘制你的场景 stuf ....(不要忘记为每个绘制的模型设置模型视图矩阵)

当然,您可以临时将您的相机位置(投影矩阵)设置为(0,0,0)并保留模型视图矩阵的身份,有时这是更精确的方法,但不要忘记在天空盒绘制后将相机位置设置回来。

希望能帮助到你。

于 2013-08-05T15:09:50.277 回答