Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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 三维光线拾取精度_Android_Opengl Es_Glu_Picking - Fatal编程技术网

Android 三维光线拾取精度

Android 三维光线拾取精度,android,opengl-es,glu,picking,Android,Opengl Es,Glu,Picking,我已经实现了3d光线拾取,但在准确性方面存在一些问题。当在屏幕的底部或中心拾取时,一切都很完美,但在屏幕的顶部,坐标似乎移动了一点。因此,当我在屏幕顶部附近拾取对象时,我通常不会拾取正在敲击的对象,而是拾取较低的对象 这是截图 我认为问题可以在矩阵中出现,所以这里是我如何定义它们的: 模型视图 GLU.gluLookAt(gl, camera.position.x, camera.position.y, camera.position.z, camera.tar

我已经实现了3d光线拾取,但在准确性方面存在一些问题。当在屏幕的底部或中心拾取时,一切都很完美,但在屏幕的顶部,坐标似乎移动了一点。因此,当我在屏幕顶部附近拾取对象时,我通常不会拾取正在敲击的对象,而是拾取较低的对象

这是截图

我认为问题可以在矩阵中出现,所以这里是我如何定义它们的:

模型视图

GLU.gluLookAt(gl, 
        camera.position.x, camera.position.y, camera.position.z,
        camera.target.x,   camera.target.y,   camera.target.z,
        camera.upAxis.x,   camera.upAxis.y,   camera.upAxis.z);
投影

horizontalCenter = 0f;
verticalCenter = 0f;
shortSideLength = 1.0f;
zNear = 1f;
zFar = 200.0f;
surfaceAspectRatio = (float) w / (float) h;
float n = shortSideLength / 2f;
gl.glFrustumf(horizontalCenter - surfaceAspectRatio*n, 
              horizontalCenter + surfaceAspectRatio*n, 
              verticalCenter - n, verticalCenter + n, zNear, zFar);
我的拣选代码:

public static Point3d pickSquare(int size, float step, float tapX, float tapY, float[] modelView, float[] projection)
{

    float[] near = new float[4];
    GLU.gluUnProject(tapX, raypickingViewport[3] - tapY, 0f, modelView, 0, projection, 0, raypickingViewport, 0, near, 0);
    if (near[3] != 0)
    {
        near[0] = near[0] / near[3];
        near[1] = near[1] / near[3];
        near[2] = near[2] / near[3];
    }
    Point3d near3 = new Point3d(near[0], near[1], near[2]);

    float[] far = new float[4];
    GLU.gluUnProject(tapX, raypickingViewport[3] - tapY, 1f, modelView, 0, projection, 0, raypickingViewport, 0, far, 0);
    if (far[3] != 0)
    {
        far[0] = far[0] / far[3];
        far[1] = far[1] / far[3];
        far[2] = far[2] / far[3];
    }
    Point3d far3 = new Point3d(far[0], far[1], far[2]);

    // here I'm searching for intersection with x0z plane using equation 
    // (x-x1)/(x2-x1) = (y-y1)/(y2-y1) = (z-z1)/(z2-z1)
    // My y is 0 so I can find x and y coords.

    float intersectY = (-near3.y) / (far3.y - near3.y);
    float pickX = intersectY * (far3.x - near3.x) + near3.x;
    float pickZ = intersectY * (far3.z - near3.z) + near3.z;
    return  new Point3d(pickX, 0f, pickZ);   
}

感谢您的回复。

问题出现在android状态栏中。在480x800屏幕上,它的高度是38像素,所以我在拾取方法中添加了这一行:

tapY-=38;
现在一切都很好