我目前正在开发增强现实应用程序。目标设备是光学看到的HMD我需要校准其显示器以实现虚拟对象的正确配准。 我使用implementation of SPAAM来安卓,结果对我来说足够精确。
我的问题是,校准应用程序在输出中给出 4x4 投影矩阵我可以直接使用OpenGL作为示例。但是,我使用的增强现实框架只接受光学校准参数,格式为 视野某些参数+ 纵横比某些参数+ 4x4 查看< / s>矩阵。
这就是我所拥有的:
以错误的格式更正校准结果:
6.191399, 0.114267, -0.142429, -0.142144
-0.100027, 11.791289, 0.05604, 0.055928
0.217304,-0.486923, -0.990243, -0.988265
0.728104, 0.005347, -0.197072, 0.003122
您可以查看生成此结果的代码here。
我所理解的是单点有源对准方法产生3×4矩阵,然后程序将该矩阵乘以正交投影矩阵以得到上面的结果。以下是用于生成正交矩阵的参数:
near : 0.1, far : 100.0, right : 960, left : 0, top : 540, bottom: 0
格式正确的校准结果不正确:
Param 1 : 12.465418
Param 2 : 1.535465
0.995903, -0.046072, 0.077501, 0.000000
0.050040, 0.994671, -0.047959, 0.000000
-0.075318, 0.051640, 0.992901, 0.000000
114.639359, -14.115030, -24.993097, 1.000000
我没有关于如何获得这些结果的任何信息。
我从二进制文件中读取这些参数,并且我不知道矩阵是以行还是列的形式存储。因此,两个矩阵可能必须转置。
我的问题是:是否有可能,如果是的话,如何从投影第一个矩阵中获取这三个参数?
答案 0 :(得分:7)
是否有可能,如果是的话,如何从投影矩阵中获取这三个参数?
投影矩阵和视图矩阵描述了完全不同的变换。虽然投影矩阵描述了从场景的3D点到视口的2D点的映射,但是视图矩阵描述了观察场景的方向和位置。视图矩阵由摄像机位置和方向以及摄像机向上矢量的方向定义。
(见Transform the modelMatrix)
这意味着无法从投影矩阵中获取视图矩阵。但是相机定义了一个视图矩阵。
如果投影是透视的,那么就可以从投影矩阵中获得视角和纵横比。
透视投影矩阵如下所示:
r = right, l = left, b = bottom, t = top, n = near, f = far
2*n/(r-l) 0 0 0
0 2*n/(t-b) 0 0
(r+l)/(r-l) (t+b)/(t-b) -(f+n)/(f-n) -1
0 0 -2*f*n/(f-n) 0
它如下:
aspect = w / h
tanFov = tan( fov_y * 0.5 );
p[0][0] = 2*n/(r-l) = 1.0 / (tanFov * aspect)
p[1][1] = 2*n/(t-b) = 1.0 / tanFov
沿Y轴的视角范围,以度为单位:
fov = 2.0*atan( 1.0/prjMatrix[1][1] ) * 180.0 / PI;
宽高比:
aspect = prjMatrix[1][1] / prjMatrix[0][0];
进一步查看以下问题的答案: