преобразовать координаты экрана в координаты opengl на плоской плоскости в 0y - PullRequest
0 голосов
/ 08 мая 2019

Преобразование экранных координат андроида в мировые координаты.

Я пытаюсь преобразовать касание экрана в мои координаты мира opengl. Мой мир - это просто плоская прямоугольная плоскость с -y вверх и -z далеко, с центром в 0,0,0. В моем представлении камеры плоскость поворачивается, так что положение камеры составляет 0, -10,7, смотря на 0,0,0. Таким образом, нажатие на screenwidth / 2, screenheight / 2 должно вернуть координаты opengl 0,0,0. Спасибо, я просто не могу обдумать это. Это моя попытка ...

//setup world coordinate matrices
/*//set camera position and angles
    Matrix.setLookAtM(cameraViewMatrix, 0, GetCameraPosition().x, -GetCameraPosition().y, GetCameraPosition().z,
        GetCameraTarget().x, GetCameraTarget().y, GetCameraTarget().z,
        0f, 1f, 0.0f);

// Setup perspective projection matrix
    Matrix.perspectiveM(perspectiveMatrix, 0, 45, aspectRatio, 0.1f, -100f);
    tempMatrix = new float[16];
    Matrix.multiplyMM(viewProjMatrix, 0, perspectiveMatrix, 0, cameraViewMatrix, 0);//add camera matrix to perspective
}*/
private PointF ScreenToGL(int screenX, int screenY){

    //get percent of screen
    float percentWidth = (float)screenX / (float)screenWidth;
    float percentHeight = (float)screenY / (float)screenHeight;

    //convert to percent of gl
    float glX = glScreenWidth * percentWidth;
    float glY = glScreenHeight * percentHeight;

    //center coordinates
    glX -= glScreenWidth/2;
    glY -= glScreenHeight/2;

    float[] startMatrix = new float[]{glX, 0, glY, 1};//opengl coordinates that are not yet multiplied by a view or proj matrix. center = 0,0,0 top left -2.5f,0,-5f, bottom right 2.5f,0,5f

    float[] inverseMatrix = new float[16];
    Matrix.invertM(inverseMatrix, 0, viewProjMatrix, 0);//inverted 

    float[] result = new float[16];
    Matrix.multiplyMV(result, 0, inverseMatrix, 0, startMatrix, 0);

    float newX = (result[0]/result[3]);
    float newY = -(result[1]/result[3]);
    float newZ = (result[2]/result[3]);

    return new PointF(newX, newZ);
}
...