glMatrix的外观是否具有相反的功能?

时间:2012-01-26 23:26:30

标签: webgl

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

2 个答案:

答案 0 :(得分:4)

我没有实现一个,没有。我甚至不确定你可以将它分解成原始载体,就此而言。 lookAt点可以是来自原点的光线的任何位置,您将如何确定适当的向上矢量是什么?我认为这是一种单向算法(只是懒得证明它!)

然而,除此之外,我怀疑你是否想要这样做,即使有一种方法。我愿意打赌,跟踪你正在使用的值并操纵它们几乎总是更有益,而不是试图将它们从矩阵中回传到矢量然后再回来。

答案 1 :(得分:2)

:是的,您可以反转模型视图转换,不会让您完全无法获得所有三个向量。

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函数仅将此矩阵用于平移和旋转。它正在调整相机前面的场景而不会扭曲它。