问题描述
对于个人项目,我使用尽可能少的库在 python 中创建了一个简单的 3D 引擎。我做了我想做的 - 我能够渲染简单的多边形,并有一个可移动的相机。但是,有一个问题:
我实现了一个简单的平面着色器,但为了让它工作,我需要知道相机的位置(相机是我的光源)。但是,问题是我无法知道相机在世界空间中的位置。在任何时候,我都可以显示我的视图矩阵,但我不确定如何从中提取相机的位置,尤其是在我旋转相机之后。这是我的引擎与视图矩阵的屏幕截图。相机尚未旋转,提取其位置 (0,1,4) 非常简单。
但是,当将相机移动到 X 轴和 Z 轴之间的一个点并将其指向上方(并保持在相同高度)时,视图矩阵会更改为:
现在很明显,不能直接取最后一列来确定相机位置(应该是最后一张图片上的(4,4))。
我尝试了很多数学,但我无法找出从视图矩阵中确定相机 x,y,z 位置的方法。我将感谢解决此问题的任何和所有帮助,因为这似乎是一个简单的问题,但我无法解决其解决方案。谢谢。
编辑:
我被建议通过我的视图矩阵转换顶点 (0,1)。然而,这行不通。参见示例(顶点显然不在打印坐标处):
解决方法
只需使用模型视图矩阵对向量 (0,1)
进行变换:这只是模型视图矩阵的最右侧列。
编辑:@ampersander:如果您假设照明源位于相机的位置,我想知道为什么您首先尝试使用相机位置。在这种情况下,请注意,在 OpenGL 中没有相机这样的东西,事实上,“视图”变换所做的就是移动世界上的一切,以便您假设相机的最终位置在坐标原点 (0,0)。
或者换句话说:在modelview变换之后,变换后的顶点位置实际上是视图空间中从相机到顶点的向量。这意味着对于您假设的照明计算,朝向光源的方向是负顶点位置。将其归一化为单位长度并将其粘贴到光照项中。