OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转
Posted
技术标签:
【中文标题】OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转【英文标题】:OpenGL/GLSL/GLM - Skybox rotates as if in 3rd person 【发布时间】:2012-08-22 00:44:09 【问题描述】:我刚刚开始使用 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 渲染天空盒?
【问题讨论】:
相机在 3d 第三人称相机中环绕它,好像它围绕它旋转 - 我很难想象你的意思,也许是图像或者一个简短的 youtube 剪辑会有所帮助? 您确定圆顶以 (0,0,0) 为中心吗?看起来顶点可能偏离中心。 我想我的问题是:如何设置矩阵以使用 glm::lookAt 渲染天空? 天空盒不就是一个拥有自己变换矩阵的物体吗?我不明白将在哪里使用 lookAt? Satchmo,您能否将天空盒模型的源数据添加到问题中?我认为这与答案有关。 【参考方案1】:Aesthete 是正确的天空盒/天穹是唯一的对象,这意味着您不会更改投影矩阵!!!
你的渲染应该是这样的:
-
清除屏幕/缓冲区
设置相机
将模型视图设置为标识,然后将其转换为相机的位置,您可以直接从投影矩阵中获取位置(如果我的记忆服务于数组位置 12、13、14)以获得矩阵,请参见https://***.com/a/18039707/2521214
绘制天空盒/天空穹顶(不要越过 z_far 平面,或禁用深度测试)
可选择清除 Z 缓冲区或重新启用深度测试
绘制你的场景......(不要忘记为你绘制的每个模型设置模型视图矩阵)
当然,您可以将相机位置(投影矩阵)临时设置为 (0,0,0) 并保留模型视图矩阵的身份,有时这是更精确的方法,但不要忘记在天空盒绘制后将相机位置设置回来.
希望对你有帮助。
【讨论】:
以上是关于OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转的主要内容,如果未能解决你的问题,请参考以下文章
Skybox 渲染的 VkRenderPass 加载操作问题