将光世界空间坐标转换为眼空间坐标
Transform light worldspace coordinates to eyespace coordinates
我试图在图形类入门的场景中建模聚光灯。赋值指定我必须在现代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
的原因是因为您不希望方向向量被平移,只缩放或旋转。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 从 3 个视点在 3 张图像上有 3 个点如何在 3D 空间中获取其坐标?
- 将鼠标坐标转换为世界空间坐标
- 在OpenGL 2.1中,即使在2D空间(具有2D纹理),也可以安全使用3D TEX坐标
- Kinect v2 将颜色坐标映射到相机空间
- Kinect:从颜色空间到世界坐标
- 从vtk渲染计算摄影机空间坐标
- DirectX剪辑空间纹理坐标
- 将光世界空间坐标转换为眼空间坐标
- 如何在负数空间中得到这样的相对坐标呢?
- 为什么我们要在OpenGL管道的片段阶段使用眼空间坐标
- David Lowe's SIFT -- 关于比例空间和图像坐标的问题(奇怪的偏移问题)
- 我是否正确地将局部空间转换为世界空间坐标