OpenGL GLM看起来行为奇怪

ryoqjall  于 2022-09-26  发布在  其他
关注(0)|答案(2)|浏览(222)

目前我正在尝试在我的游戏中实现太阳的阴影贴图。为此,我需要使用GLM的查看功能来渲染太阳视角下的场景。以下是我的代码:

projection = glm::ortho<float>(-200, 200, -200, 200, -200, 400);
view = glm::lookAt(sun_pos_modelspace, -target_position_modelspace, glm::vec3(0, 1, 0)); // target needs to be negative for correct camera direction
final_matrix = projection * view;

这可以很好地工作,因为当游戏开始时,场景是从太阳的Angular 渲染的。但当我平移目标时,视图矩阵似乎从其原始的眼睛位置(即太阳的位置)移动。我根本不想让眼睛移动,我只想让相机坐在太阳的位置,直视目标向量。

我是否应该使用其他GLM函数来解决这个问题?还是我用错了lookAt?

vaqhlq81

vaqhlq811#

glm::lookAt的三个参数是eyecenterup。所以,你把你的眼睛放在任何你想要的地方,它不应该自己移动。将它设置到太阳的位置看起来是正确的(但要确保它是在世界坐标中)

看起来有点可疑的是你的中心参数。这应该是摄像机应该看到的地方。对我来说,否定某些世界地位是没有意义的:)

尽管否定,但屏幕上显示任何内容的原因可能是您的近平面(glm::ortho中倒数第二个参数)。通常,这是您希望对象在相机前可见的距离。使用负值时,您将看到摄影机后面的对象。

编辑:为了澄清,在正交图投影中有负的近平面是有意义的,我只是认为让太阳在某个遥远的位置,然后让它渲染它前面的一切会更容易。这可能会让这件事在概念上变得更容易。

长话短说,试着不要否定目标位置,而是对近平面使用一些正值。

zpgglvta

zpgglvta2#

我最近在使用GLM::LookAt函数时非常紧张。我的系统的相机使用了极轴的概念,其中相机对象的位置是目标坐标,眼睛与目标坐标有偏移和方向。我的坐标系有向右的+x,向前的+y和向上的+z;因此,具有单位旋转的朝向向量将是(0,1,0)。我在LH模式下使用GLM。

如果我将面向身份的相机的极距离设置为5,则眼点被计算为(0,-5,0),面向向量为(0,1,0)-两者都是正确的-但GLM::lookAt将给出一个视图矩阵,其中眼点位于(0,5,0),面向(0,-1,0)……所以我会从错误的Angular 看这一幕。这一点是通过渲染一个立方体来确认的,该立方体的表面带有纹理以显示它们所在的一侧,然后在RenderDoc中进一步测试(由于存储了延迟照明的世界坐标,我可以看到结果像素的位置)。

跳过GLM::lookAt中的设置和向量生成代码(因为我预计算面向、向右和向上向量),这是我自己编写的纠正问题的代码:

view[0][0] = right.x;
view[1][0] = right.y;
view[2][0] = right.z;
view[3][0] = 0;
view[0][1] = up.x;
view[1][1] = up.y;
view[2][1] = up.z;
view[3][1] = 0;
view[0][2] = -facing.x;
view[1][2] = -facing.y;
view[2][2] = -facing.z;
view[3][2] = 0;
view[3][0] = dot(right, -eyepos);
view[3][1] = dot(up, -eyepos);
view[3][2] = dot(facing, -eyepos);
view[3][3] = 1;

请注意与GLM的区别:

  • 将view[3][0]、view[3][1]和view[3][2]设置为0,而不是1
  • 否定眼球,而不是点积结果

考虑到这个帖子太老了,这对OP的用处可能有限,但我今天才解决了这个问题。

相关问题