1

我正在尝试将 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
4

0 回答 0