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

时间:2013-03-17 01:35:08

标签: c++ glsl

我正在尝试为场景中的聚光灯建模以介绍图形类。赋值指定我必须在modernGL中执行所有操作,因此我无法使用遗留任何内容。

我一直在阅读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是由

生成的模型视图矩阵
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));

没有任何变换。正如您所看到的,我试图乘以模型视图的逆和模型视图来获得眼睛空间。我很肯定,当我移动到物体的另一侧时,这些都没有像我的物体上的镜面高光那样起作用。 (即如果我正在看物体的另一侧,那就是我不应该看到一个镜面高光。)

1 个答案:

答案 0 :(得分: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矩阵反转的位置。是的,乘法的顺序很重要。您在0坐标中留下w的原因是您不希望转换方向向量,只进行缩放或旋转。