拡張現実アプリのプレビュー カメラで OpenGL シーンを調整しようとしていますが、定義された OpenGL パースペクティブとカメラ プレビューが一致していないようです。周りを見渡すと、私の視野は明らかに広すぎます (垂直方向と水平方向の両方で)。
Q:両方を校正するという考えを誤解しましたか?
編集:次のチェックを行いましたが、結果を自分で説明できません。以下の射影行列を使用する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