将光世界空间坐标转换为眼空间坐标

Transform light worldspace coordinates to eyespace coordinates

本文关键字:坐标 空间 转换 世界      更新时间:2023-10-16

我试图在图形类入门的场景中建模聚光灯。赋值指定我必须在现代gl中做所有事情,因此我不能使用任何来自遗留的东西。

我一直在阅读OpenGL 4.0着色语言烹饪书来帮助我,但我不知道如何为我的灯获得眼空间坐标。我知道我希望灯光在世界空间中的位置和方向,我已经尝试通过以下方式将它们转换为视觉空间。

//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是由

生成的modelview矩阵
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));

没有任何变换。正如您所看到的,我试图乘以模型视图和模型视图的逆以获得眼空间。我很肯定,这两种方法都不起作用,因为当我移动到物体的另一边时,物体上的高光会跟着我。(例如,如果我看的是物体的另一边,我不应该看到一个镜面高光。)

我很确定你想:

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矩阵。是的,乘法的顺序很重要。您在w坐标中留下0的原因是因为您不希望方向向量被平移,只缩放或旋转。