【发布时间】:2018-02-21 07:08:37
【问题描述】:
我目前正在开发增强现实应用程序。目标设备是光学透视 HMD,我需要校准其显示器以实现虚拟对象的正确配准。 我用 implementation of SPAAM 让 android 来做这件事,结果对我的目的来说足够精确。
我的问题是,校准应用程序会在输出中提供一个 4x4 projection 矩阵,例如,我可以直接与 OpenGL 一起使用。但是,我使用的增强现实框架只接受 Field of View some parameter + Aspect Ratio some parameter + 4x4 View 矩阵。
这是我所拥有的:
错误格式下的正确校准结果:
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
我没有任何关于如何获得这些结果的信息。
我从二进制文件中读取这些参数,我不知道矩阵是以行还是列的主要形式存储的。所以这两个矩阵可能必须转置。
我的问题是:是否有可能,如果可以,如何从我拥有的 projection 第一个矩阵中获取这三个参数?
【问题讨论】:
-
投影矩阵和视图矩阵是不同的东西——见Transform the modelMatrix。可能是
fov = 2.0*atan(1.0/prjM[1][1])*180.0/PI; aspect = prjM[1][1]/prj[0][0]- 见How to recover view space position given view space depth value and ndc xy -
可以从投影矩阵中获取该信息,但您需要知道使用了什么公式来构造它。
-
Derp,我看不懂。我没有注意到视图矩阵也在那里。您可以从投影矩阵中提取的最多的是 fov 和纵横比
-
从哪里知道标定结果是正确的?
-
因为一旦加载到各自的框架中,第一个结果会产生良好的虚拟对象注册,而第二个结果会产生错误的注册。
标签: opengl matrix aspect-ratio perspectivecamera