Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将FOV角度转换为透视投影参数_Android_Opengl Es_Camera_Opengl Es 2.0_Perspective - Fatal编程技术网

Android 将FOV角度转换为透视投影参数

Android 将FOV角度转换为透视投影参数,android,opengl-es,camera,opengl-es-2.0,perspective,Android,Opengl Es,Camera,Opengl Es 2.0,Perspective,我有一个程序,可以获取设备后向摄像头的FOV角度,它返回水平和垂直角度,单位为度,如下所示: 54.8 42.5 是否有一种简单的转换方法可以应用于获取右“左、右、下、上”参数以传递到OpenGL的Matrix.frustrumM()中 我正在将OpenGL图形叠加到CameraView上,希望确保它们相对于摄影机提要中的真实世界对象正确绘制,无论摄影机的视野如何 非常感谢 编辑:这里有一个解决方案,以防任何人遇到此问题: private float[] perspectiveM(float

我有一个程序,可以获取设备后向摄像头的FOV角度,它返回水平和垂直角度,单位为度,如下所示:

54.8
42.5
是否有一种简单的转换方法可以应用于获取右“左、右、下、上”参数以传递到OpenGL的Matrix.frustrumM()中

我正在将OpenGL图形叠加到CameraView上,希望确保它们相对于摄影机提要中的真实世界对象正确绘制,无论摄影机的视野如何

非常感谢


编辑:这里有一个解决方案,以防任何人遇到此问题:

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;
}
private float[]透视图m(float fovY、float fovX、float zNear、float zFar)
{
float[]projMatrix=新的float[16];
浮动方向=fovX/fovY;
fovY=(float)((fovY/180.0)*Math.PI);//度到弧度
float g=(float)(1/Math.tan(fovY/2));

对于(int i=0;i我没有意识到perspectiveM被限制在某个API级别,但是您可以自己轻松地重新创建函数。公式在gluPerspective的手册页上,其工作方式相同

您可以使用以下等式自己构建浮点矩阵:


Matrix.perspectiveM()会做你想做的吗?是的,但这只在API级别14中实现,我的目标是10。查看此网站以了解透视投影的概念,谢谢,这就是我最终要做的。
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;
}