【问题标题】:How to determine camera location from view matrix?如何从视图矩阵确定相机位置?
【发布时间】:2021-06-08 18:03:09
【问题描述】:

对于个人项目,我使用尽可能少的库在 python 中创建了一个简单的 3D 引擎。我做了我想做的事——我能够渲染简单的多边形,并且有一个可移动的相机。但是,有一个问题:

我实现了一个简单的平面着色器,但为了让它工作,我需要知道相机的位置(相机是我的光源)。但是,问题是我无法知道相机在世界空间中的位置。在任何时候,我都可以显示我的视图矩阵,但我不确定如何从中提取相机的位置,尤其是在我旋转相机之后。这是我的引擎与视图矩阵的屏幕截图。相机尚未旋转,提取其位置(0、1、4)非常简单。

但是,在将相机移动到 X 轴和 Z 轴之间的点并将其指向上方(并保持相同高度)时,视图矩阵会变为:

现在很明显,不能直接取最后一列来确定相机位置(它应该是最后一张图片上的(4,1,4)之类的东西)。

我已经尝试了很多数学运算,但我无法弄清楚从视图矩阵中确定相机 x、y、z 位置的方法。我将感谢解决此问题的任何和所有帮助,因为这似乎是一个简单的问题,但我的解决方案却让我望而却步。谢谢。

编辑: 有人建议我通过我的视图矩阵转换一个顶点 (0,0,0,1)。但是,这不起作用。看例子(顶点显然不在打印的坐标处):

【问题讨论】:

    标签: matrix graphics 3d vertices


    【解决方案1】:

    只需将向量(0,0,0,1) 与模型视图矩阵进行变换即可:这只是模型视图矩阵的最右列。

    编辑:@ampersander:如果您假设照明源位于相机的位置,我想知道为什么您首先要尝试使用相机位置。在这种情况下,请注意,在 OpenGL 中没有相机之类的东西,事实上,“视图”变换所做的是移动世界上的所有东西,以便您假设相机的位置结束在坐标原点(0,0,0)。

    或者换句话说:在模型视图变换之后,变换后的顶点位置实际上是在视图空间中从相机到顶点的向量。这意味着对于您假设的照明计算,朝向光源的方向是负顶点位置。将其归一化为单位长度并将其粘贴到光照项中。

    【讨论】:

    • 感谢您的回答。不幸的是,它不起作用。查看我的编辑
    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多