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