OpenGL / GLSL / GLM - Skybox像第三人一样旋转

时间:2012-08-22 00:44:10

标签: c++ opengl glsl glm-math

我刚刚开始实现天空盒,我正在使用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?

1 个答案:

答案 0 :(得分:2)

Esthete是对的skybox / skydome只是对象意味着你不改变投影矩阵!!!

你的渲染应该是这样的:

  1. 清除屏幕/缓冲区
  2. 设置相机
  3. 将modelview设置为identity,然后将其转换为相机的位置,您可以直接从投影矩阵获取位置(如果我的记忆服务于数组位置12,13,14)以获得矩阵,请参阅此https://stackoverflow.com/a/18039707/2521214 < / LI>
  4. 绘制skybox / skydome(不要越过z_far平面,或禁用深度测试)
  5. optionaly清除Z缓冲区或重新启用深度测试
  6. 绘制场景stuf ....(不要忘记为每个绘制的模型设置模型视图矩阵)
  7. 当然你可以暂时将你的相机位置(投影矩阵)设置为(0,0,0)并保留带有标识的modelview矩阵,有时候会更加精确,但不要忘记在天空盒绘制后将相机位置设置回来

    希望它有所帮助。