目前我正在尝试在游戏中为太阳实施阴影贴图。为此,我需要使用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;
这很好用,因为场景是在游戏开始时从太阳的角度渲染的。但是当我翻译目标时,视图矩阵似乎从其原始眼睛位置(这是太阳的位置)移动。我根本不想让眼睛移动,我只是希望相机坐在太阳的位置,直接看向目标矢量。
我应该使用其他一些glm函数来解决这个问题吗?或者我使用lookAt不正确?
答案 0 :(得分:0)
glm::lookAt
的三个参数是eye
,center
和up
。所以,你把眼睛放在任何你想要的地方,它不应该自己移动。将它设置为太阳的位置看起来是正确的(但要确保它在世界坐标中)
看起来有点可疑的是你的中心参数。它应该是相机应该注意的点。否定一些世界的位置对我来说没有意义:))
你在屏幕上有任何东西的原因尽管否定可能是你的近平面(glm::ortho
中倒数第二个参数)。通常,您希望在相机前看到物体的距离。使用负值,您将看到相机背后的物体。
编辑:澄清一点,在正射投影中有负近平面是有意义的,我只是觉得在太阳的某个遥远的位置让太阳更容易,然后让它渲染在它前面的所有东西。这可能会使这在概念上更容易。
长话短说,尽量不要否定目标位置并对近平面使用一些正值。