我正在尝试为场景中的聚光灯建模以介绍图形类。赋值指定我必须在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));
没有任何变换。正如您所看到的,我试图乘以模型视图的逆和模型视图来获得眼睛空间。我很肯定,当我移动到物体的另一侧时,这些都没有像我的物体上的镜面高光那样起作用。 (即如果我正在看物体的另一侧,那就是我不应该看到一个镜面高光。)
答案 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
的原因是您不希望转换方向向量,只进行缩放或旋转。