【问题标题】:Field of view + Aspect Ratio + View Matrix from Projection Matrix (HMD OST Calibration)视野 + 纵横比 + 投影矩阵的视图矩阵(HMD OST 校准)
【发布时间】: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


【解决方案1】:

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

投影矩阵和视图矩阵描述了完全不同的变换。投影矩阵描述了从场景的 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];

进一步查看以下问题的答案:
How to render depth linearly in modern OpenGL with gl_FragCoord.z in fragment shader?
How to recover view space position given view space depth value and ndc xy

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多