【发布时间】:2012-06-21 00:26:22
【问题描述】:
我有一个程序可以获取设备后置摄像头的 FOV 角度,它以度数返回水平和垂直角度,如下所示:
54.8
42.5
是否有一个简单的转换可以应用来获取正确的“左、右、下、上”参数以传递到 OpenGL 的 Matrix.frustrumM()?
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
我将 OpenGL 形状叠加到 CameraView 上,并希望确保它们相对于相机馈送中的真实世界对象正确绘制,适用于所有设备,无论相机的 FOV 是什么。
非常感谢!
编辑:这是一个解决方案,以防万一有人遇到这个问题:
private float[] perspectiveM(float fovY, float fovX, float zNear, float zFar)
{
float[] projMatrix = new float[16];
float aspect = fovX / fovY;
fovY = (float) ((fovY /180.0) * Math.PI); // degrees to radians
float g = (float) (1 / Math.tan(fovY / 2));
for(int i=0; i<16; i++) {
switch (i) {
case 0:
projMatrix[i] = g / aspect;
break;
case 5:
projMatrix[i] = g;
break;
case 10:
projMatrix[i] = (zFar + zNear)/(zNear - zFar);
break;
case 11:
projMatrix[i] = -1.0f;
break;
case 14:
projMatrix[i] = (2 * zFar * zNear)/(zNear - zFar);
break;
default:
projMatrix[i] = 0.0f;
}
}
return projMatrix;
}
然后将返回结果分配给你的投影矩阵。
【问题讨论】:
-
Matrix.perspectiveM() 会做你想做的事吗?
-
是的,但这仅在 API 级别 14 中实现,我的目标是 10。
-
查看本网站了解透视投影的概念mathdisk.com/pub/safi/worksheets/Perspective_Projection
标签: android opengl-es camera opengl-es-2.0 perspective