Я создаю приложение для Android, использующее OpenGL ES 2.0, и наткнулся на стену. Я пытаюсь преобразовать координаты экрана (куда прикасается пользователь) в мировые координаты. Я пытался читать и играть с GLU.gluUnProject, но я либо делаю это неправильно, либо просто не понимаю.
Это моя попытка....
public void getWorldFromScreen(float x, float y) {
int viewport[] = { 0, 0, width , height};
float startY = ((float) (height) - y);
float[] near = { 0.0f, 0.0f, 0.0f, 0.0f };
float[] far = { 0.0f, 0.0f, 0.0f, 0.0f };
float[] mv = new float[16];
Matrix.multiplyMM(mv, 0, mViewMatrix, 0, mModelMatrix, 0);
GLU.gluUnProject(x, startY, 0, mv, 0, mProjectionMatrix, 0, viewport, 0, near, 0);
GLU.gluUnProject(x, startY, 1, mv, 0, mProjectionMatrix, 0, viewport, 0, far, 0);
float nearX = near[0] / near[3];
float nearY = near[1] / near[3];
float nearZ = near[2] / near[3];
float farX = far[0] / far[3];
float farY = far[1] / far[3];
float farZ = far[2] / far[3];
}
Цифры, которые я получаю, кажутся неправильными, правильно ли использовать этот метод? Это работает для OpenGL ES 2.0? Должен ли я сделать матрицу модели единичной матрицей перед этими вычислениями (Matrix.setIdentityM(mModelMatix, 0))?
В качестве дополнения, если это правильно, как мне выбрать выход Z? По сути, я всегда знаю, на каком расстоянии мне нужны мировые координаты, но параметр Z в GLU.gluUnProject кажется своего рода интерполяцией между ближней и дальней плоскостями. Это просто линейная интерполяция?
Заранее спасибо