glMatrix是否存在查找的反向函数



我正在使用glMatrix对Webgl进行编码,并希望从现有的投影和视图矩阵中获得眼睛的位置、焦点和向上方向(有点像lookat函数的反向)。有办法做到这一点吗?

我没有实现一个,没有。我甚至不确定你能不能把它分解成原始向量。lookAt点可以是从原点沿着射线的任何位置,您将如何确定适当的向上矢量?我认为这是一个单向算法(只是懒得证明!)

然而,除此之外,我质疑你是否愿意这样做,即使有一种方法。我敢打赌,跟踪你正在使用的值并对其进行操作,而不是试图将它们从矩阵来回拉到向量,这几乎总是更有益的。

:是的,您可以反转模型视图转换,而不是,您不会得到完全相同的三个向量。

lookAt的模型视图转换与CSG模型中使用的connectTo操作非常相似。它正在你的相机前安装你的场景。这是通过平移和三轴旋转来完成的。将eye点转换为(0,0,0),并围绕它进行所有进一步的旋转。通过用逆矩阵变换(0,0,0),可以很容易地导出眼点。

但中心点仅用于沿-Z轴调整视图轴。在openGL中,眼睛面向-Z。失去了中心和眼睛之间的距离。因此,如果你自己定义距离,你可以很容易地沿着你的视线轴获得一个中心点。假设我们想要d的距离。然后我们只需要用逆矩阵变换(0,0,-d),就可以得到一个有效的中心点,但并不完全相同。中心点仅定义两个旋转角度,即相机平移和倾斜。

更糟糕的是上向量的重建。它仅用于相机的滚动角度,因此仅用于一个标量值。因此,对于逆变换,您不仅可以选择沿Y轴的任何正值,还可以选择YZ平面中具有正Y值的任何点。为了得到一个完全垂直于视轴且大小为1的上矢量,我们只需用逆矩阵变换(0,1,0)。记住这次变换为矢量(而不是点)。

现在我们对眼睛、中心和上表面进行了重建,以便下次得到与lookAt完全相同的结果。但由于这个矩阵只包含6个信息值(平移、平移、倾斜、滚动),我们不得不选择3个丢失的值(中心到眼睛的距离、相机YZ平面上矢量的大小和角度)。

模型视图矩阵当然可以进行其他变换(任何仿射变换),但lookAt函数仅将该矩阵用于平移和旋转。它在不失真的情况下调整相机前面的场景。

最新更新