校准OpenGL投影矩阵和硬件摄像机视野?

时间:2013-11-04 15:32:18

标签: android opengl-es android-camera

我正在尝试将OpenGL场景校准到预览相机上以获得增强现实应用,但定义的OpenGL视角和相机预览似乎不匹配。 虽然环顾我的视野显然太大(在垂直/水平方向)。

问:我是否误解了校准两者的想法?

编辑:我做了以下检查,但无法向自己解释结果。 使用下面的trueVerticalFOV作为我的投影矩阵,相机预览和OpenGL完美匹配。

似乎getVerticalViewAngle()没有返回正确的值。我在物理上也测量了FOV,结果是trueVerticalFOV

新问题:为什么会这样?有什么建议吗?

凸轮预览尺寸和GLSurfaceView也是800x480,凸轮缩放为零。

float horizontalFOV =
    camera.getParameters().getHorizontalViewAngle();    // = 60.5
float verticalFOV =
    camera.getParameters().getVerticalViewAngle();      // = 47.1
float camAspect = hFOV / vFOV;                          // = 1.2845...

float displayWidth =
    getResources().getDisplayMetrics().widthPixels;     // = 800
float displayHeight =
    getResources().getDisplayMetrics().heightPixels;    // = 480
float displayAspect = displayWidth / displayHeight;     // = 1.666...

float trueVerticalFOV = horizontalFOV / displayAspect;  // = 36.30...

/修改

设备的相机垂直FOV:

projectionFieldOfView = camera.getParameters().getVerticalViewAngle();

GLSurfaceView的宽高比:

public void onSurfaceChanged(GL10 unused, int width, int height) {
    ...
    projectionAspect = (float) width / (float) height;
    ...
}

OpenGL的投影矩阵:

Matrix.perspectiveM(
    projectionMatrix,           // projection matrix array
    0,                          // array offset
    projectionFieldOfView,      // FOV [deg]            = 47.1 deg
    projectionAspect,           // aspect ratio         = 1.667
    projectionNearClipping,     // Near clipping plane  = 1
    projectionFarClipping );    // Far clipping plane   = 3000

0 个答案:

没有答案