2017-09-12 109 views
1

我目前正在研究增强现实应用程序。目标设备是光学透视HMD,我需要校准其显示器以实现虚拟对象的正确配准。 我用那个implementation of SPAAM为android来做到这一点,结果足够精确,我的目的。视野+屏幕比例+从投影矩阵(HMD OST校准)查看矩阵

我的问题是,校准应用程序输出给一个4×4 投影矩阵我可以直接与OpenGL的使用为例。但是,我仅使用接受光学校准参数的Augmented Reality框架,其格式为 Field of View某些参数+ 长宽比某些参数+ 4x4 查看矩阵。

以下是我有:在错误的格式

正确的校准结果:

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代码。

我的理解是单点主动对准方法生成一个3x4矩阵,然后程序将该矩阵乘以正交投影矩阵以得到上面的结果。下面是用于生产正交矩阵帕拉姆:在正确的格式

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 

我没有对如何获得这些结果的任何信息。

我从二进制文件中读取这些参数,我不知道矩阵是以行还是列主要形式存储的。所以这两个矩阵可能必须转置。

我的问题是:是否有可能,如果是,如何从投影第一矩阵得到这三个参数我有吗?

+4

投影矩阵的视图矩阵是不同的东西 - 请参阅[转换modelMatrix](https://stackoverflow.com/questions/46008171/transform-the-modelmatrix/46008573#46008573)。可能'fov = 2.0 * atan(1.0/prjM [1] [1])* 180.0/PI; aspect = prjM [1] [1]/prj [0] [0]' - 请参阅[如何恢复视图空间位置给定视图空间深度值和ndc xy](https://stackoverflow.com/questions/11277501/how -to-recover-view-space-position-given-view-space-depth-value-and-ndc-xy/46118945) – Rabbid76

+0

可以从投影矩阵中获取该信息,但是您需要知道用什么公式来构造它。 –

+0

@MrSmith投影矩阵和视图矩阵是不同的东西,你不能走出投影矩阵的视图矩阵! – Rabbid76

回答

1

是否有可能,如果是的话,如何从投影矩阵中得到这三个参数?

投影矩阵和视图矩阵描述了完全不同的变换。虽然投影矩阵描述了从场景的三维点到视口的二维点的映射,但视图矩阵描述了场景的方向和位置。视图矩阵由摄像机位置和方向定义为摄像机的目标视角和向上矢量。
(请参阅Transform the modelMatrix

这意味着无法从投影矩阵中获取视图矩阵。但相机定义了一个视图矩阵。


如果投影是透视,那么将有可能从投影矩阵得到视场角和纵横比。

enter image description here

透视投影矩阵是这样的:

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]; 


进一步参看回答下列问题:

+1

感谢您的解释,我了解什么是投影,视图和模型矩阵。我编辑了我的问题,以更好地解释我需要的东西。 – Raoul