2

我正在尝试在场景中为聚光灯建模,以介绍图形类。作业指定我必须在modernGL 中做所有事情,因此我不能使用遗留的任何东西。

我一直在阅读 OpenGL 4.0 Shading Language Cookbook 以寻求帮助,但我不知道如何获取我的灯光的眼空间坐标。我知道我希望灯光在世界空间中的位置和方向,并且我尝试通过以下方式将它们转换为眼睛空间。

//mv = inverse(mv);
vec3 light = vec3(vec4(0.0, 15.0, 0.0, 1.0) * mv);
vec3 direction = vec3(vec4(0.0, -1.0, 0.0, 1.0) * mv);

其中 mv 是我的模型视图矩阵由

glm::mat4 modelview_matrix = glm::lookAt(glm::vec3(window.camera.x, window.camera.y, window.camera.z), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));

没有任何变换。如您所见,我试图乘以模型视图和模型视图的倒数来获得眼睛空间。我很肯定这些都没有起作用,因为当我移动到对象的另一侧时,我的对象上的镜面高光随之而来。(即,如果我正在看物体的另一侧,我不应该看到高光。)

4

1 回答 1

0

我相当肯定你想要:

vec3 light = vec3(mv * vec4(0.0, 15.0, 0.0, 1.0));
vec3 direction = vec3(mv * vec4(0.0, -1.0, 0.0, 0.0));
                                             // ^ Note the 0 in the w coordinate

没有反转你的mv矩阵。是的,乘法的顺序确实很重要。将 a 留0w坐标中的原因是您不希望方向矢量被平移,而只是缩放或旋转。

于 2013-03-17T01:52:51.333 回答