视野 + 纵横比 + 投影矩阵的视图矩阵(HMD OST 校准)
Field of view + Aspect Ratio + View Matrix from Projection Matrix (HMD OST Calibration)
我目前正在开发增强现实应用程序。目标设备是光学透视 HMD,我需要校准其显示器以实现虚拟对象的正确注册。
我将 implementation of SPAAM 用于 android 来完成它,结果对于我的目的来说足够精确。
我的问题是,校准应用程序在输出中给出 4x4 投影 矩阵 例如,我可以直接使用 OpenGL。但是,我使用的增强现实框架只接受格式为 Field of View some parameter + Aspect Ratio some 的光学校准参数参数 + 4x4 View matrix.
这是我的资料:
修正错误格式下的校准结果:
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
我不知道这些结果是如何获得的。
我从二进制文件中读取这些参数,但我不知道矩阵是以行或列主要形式存储的。所以这两个矩阵可能需要转置。
我的问题是:是否可能,如果可以,如何从我的 投影 第一个矩阵中获取这三个参数?
Is it possible, and if yes, how to get these three parameters from the projection matrix I have ?
投影矩阵和视图矩阵描述了完全不同的变换。投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射,而视图矩阵描述了观察场景的方向和位置。视图矩阵由相机位置和方向以及视图目标和相机的向上矢量定义。
(参见)
这意味着无法从投影矩阵中获取视图矩阵。但是相机定义了一个视图矩阵。
如果投影是透视的,那么就可以从投影矩阵中得到视野角和纵横比。
透视投影矩阵如下所示:
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
我目前正在开发增强现实应用程序。目标设备是光学透视 HMD,我需要校准其显示器以实现虚拟对象的正确注册。 我将 implementation of SPAAM 用于 android 来完成它,结果对于我的目的来说足够精确。
我的问题是,校准应用程序在输出中给出 4x4 投影 矩阵 例如,我可以直接使用 OpenGL。但是,我使用的增强现实框架只接受格式为 Field of View some parameter + Aspect Ratio some 的光学校准参数参数 + 4x4 View matrix.
这是我的资料:
修正错误格式下的校准结果:
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
我不知道这些结果是如何获得的。
我从二进制文件中读取这些参数,但我不知道矩阵是以行或列主要形式存储的。所以这两个矩阵可能需要转置。
我的问题是:是否可能,如果可以,如何从我的 投影 第一个矩阵中获取这三个参数?
Is it possible, and if yes, how to get these three parameters from the projection matrix I have ?
投影矩阵和视图矩阵描述了完全不同的变换。投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射,而视图矩阵描述了观察场景的方向和位置。视图矩阵由相机位置和方向以及视图目标和相机的向上矢量定义。
(参见
这意味着无法从投影矩阵中获取视图矩阵。但是相机定义了一个视图矩阵。
如果投影是透视的,那么就可以从投影矩阵中得到视野角和纵横比。
透视投影矩阵如下所示:
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