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