Проблема с получением правильных непрогнозируемых сенсорных координат с помощью GLES20 на Android - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь разработать простое игровое приложение для Android, используя OpenGL в качестве своей базы.Пока что у меня есть базовая настройка с некоторыми формами и классом объектов, который создает квадрат.Камеру можно перемещать, касаясь и перетаскивая, и увеличивая масштаб двумя пальцами.Я пытался взглянуть на многие учебные пособия о том, как использовать gluUnProject для получения сенсорных координат и преобразования их в мировые координаты.До сих пор я получал очень смешанные результаты, такие как неточные координаты, когда касание достигает краев экрана.Вот база моего кода обнаружения касания для справки:

public int selectEntity(float x, float y)
{
    //x and y parameters are the raw touch coordinates
    for(GameObj entity: entities)
    {
        System.out.println("Coordinates of touch before matrix transformation: X: " + x + ", Y: " + y);
        y = mView[3] - y; //flipping y to match y origin
        System.out.println("Coordinates of touch after flipping Y: X: " + x + ", Y: " + y);

        //I have used two matrices to hold unprojected transforms:
        //nearPos is calculated using nearPlane value of 1
        //farPos is calculate using farPlane value of 10
        float[] nearPos = new float[4];
        float[] farPos = new float[4];

        //I pass the MVPMatrix as the 4th parameter currently, although
        //everywhere else that I've seen, the modelView matrix is used,
        //but I have no idea how that is acquired. I have tried using
        //GLES11 to fetch it but that gave me no results. I have also
        //tried passing the View Matrix, but that gave worse results.
        //mView holds [0,0,width,height] of screen
        boolean unprojectedNear = (GLU.gluUnProject(x, y, 1,
                mMVPMatrix, 0, mProjectionMatrix, 0,
                mView, 0, nearPos, 0) == GLES20.GL_TRUE);
        boolean unprojectedFar = (GLU.gluUnProject(x, y, 10,
                mMVPMatrix, 0, mProjectionMatrix, 0,
                mView, 0, farPos, 0) == GLES20.GL_TRUE);
        if (unprojectedNear && unprojectedFar)
        {
            System.out.println("Converted point coords at farpos: X: " + farPos[0]/farPos[3] + ", Y: " + farPos[1]/farPos[3] + ", Z(?): " + farPos[2]/farPos[3] );
            System.out.println("Converted point coords at nearpos: X: " + nearPos[0]/nearPos[3] + ", Y: " + nearPos[1]/nearPos[3] + ", Z(?): " + nearPos[2]/nearPos[3] );

            //dividing by the w component
            nearPos[0] /= nearPos[3];
            nearPos[1] /= nearPos[3];
            nearPos[2] /= nearPos[3];
            nearPos[3] /= nearPos[3];

            farPos[0] /= farPos[3];
            farPos[1] /= farPos[3];
            farPos[2] /= farPos[3];
            farPos[3] /= farPos[3];

            //It is to my belief that the correct (x,y) world coordinates should be contained in either
            //(nearPos[0],nearPos[1]), or in (farPos[0],farPos[1])
        }

        //I have tried to use farPos instead of nearPos here with inconcusive results
        if(entity.touched(nearPos[0], nearPos[1]))
        {
            System.out.println("I AM AN OBJECT AND I HAVE BEEN TOUCHED");
        }
    }
    return -1;
}

Я не слишком знаком со сложностями OpenGL, но я думаю, что моя проблема может заключаться в том, что я не могу должным образом импортировать матрицу modelView.Сама концепция все еще смущает меня, это просто умножение модели объекта на матрицу вида?Не будет ли достаточно пройти матрицу вида?Кроме того, я планирую сделать свою игру в 2D, так что в этом случае мне действительно нужно беспокоиться об использовании значений в дальнем и ближнем плане из-за ортогональной проекции?

Если какой-либо другой кусок моегокод поможет лучше понять эту проблему, я буду рад ее предоставить.

Спасибо.

...