繁体   English   中英

OpenGL / GLSL / GLM-Skybox旋转就像在第三人称中一样

[英]OpenGL/GLSL/GLM - Skybox rotates as if in 3rd person

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

天空盒的模型可以很好地加载,但是相机会对其进行环绕,就像它在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设置正确的矩阵以渲染天空盒?

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

您的渲染应该是这样的:

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

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

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM