OpenGL/GLSL/GLM - 如何让天空盒像第三人称一样旋转

4

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

天空盒的模型加载得很好,但相机似乎在以第三人称相机的方式围绕它旋转。

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

我知道天空盒不适用于平移,只考虑旋转,所以我不确定问题出在哪里。有没有更简单的方法来解决这个问题?
视觉辅助:
没有任何移动的正面: Straight on when I first start the program 当我旋转相机时: enter image description here 我的问题是:如何使用glm:lookAt设置正确的矩阵来渲染天空盒?

我很难想象你所说的意思,也许一张图片或一个短的YouTube视频可以帮助理解?同时,相机似乎围绕着物体旋转,就像是在进行第三人称3D摄像。 - Tim
你确定该圆顶以 (0,0,0) 为中心吗?看起来顶点可能偏离中心。 - Tim
我想问的是:如何使用glm::lookAt设置矩阵以渲染天空? - Satchmo Brown
天空盒不就是一个带有自己变换矩阵的对象吗?我不明白 lookAt 会在哪里使用? - Aesthete
Satchmo,你能否在问题中添加天空盒模型的源数据?我认为这对回答很有帮助。 - Tim
@Tim,我最终解决了这个问题。答案在下面。 - Satchmo Brown
1个回答

2
美学家是正确的,天空盒/天空圆顶只是一个对象,这意味着您不需要改变投影矩阵!!!
您的渲染应该像这样:
1.清除屏幕/缓冲区 2.设置相机 3.将模型视图设置为标识,然后将其平移到相机位置,您可以直接从投影矩阵中获取位置(如果我记得正确,位置在数组位置12,13,14),要获取矩阵,请参见https://stackoverflow.com/a/18039707/2521214 4.绘制天空盒/天空圆顶(不要跨越z_far平面,或禁用深度测试) 5.可选地清除Z缓冲区或重新启用深度测试 6.绘制您的场景(不要忘记为每个绘制的模型设置模型视图矩阵)
当然,您可以临时将相机位置(投影矩阵)设置为(0,0,0),并保留标识的模型视图矩阵,这有时是更精确的方法,但不要忘记在绘制天空盒后将相机位置设置回来。
希望能对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接