Что ж, для меня самым простым способом было представить, что щелчок на экране - это луч, который начинается в положении камеры и уходит в бесконечность
Чтобы получить этот луч, мне нужно было запросить его мировые координаты как минимум в 2 позициях Z (в виде координат).
Вот мой метод нахождения луча (я думаю, из того же демо-приложения для Android).
Он прекрасно работает в моем приложении:
public void Select(float x, float y) {
MatrixGrabber mg = new MatrixGrabber();
int viewport[] = { 0, 0, _renderer.width, _renderer.height };
_renderer.gl.glMatrixMode(GL10.GL_MODELVIEW);
_renderer.gl.glLoadIdentity();
// We need to apply our camera transformations before getting the ray coords
// (ModelView matrix should only contain camera transformations)
mEngine.mCamera.SetView(_renderer.gl);
mg.getCurrentProjection(_renderer.gl);
mg.getCurrentModelView(_renderer.gl);
float realY = ((float) (_renderer.height) - y);
float nearCoords[] = { 0.0f, 0.0f, 0.0f };
float farCoords[] = { 0.0f, 0.0f, 0.0f };
gluUnProject(x, realY, 0.0f, mg.mModelView, 0, mg.mProjection, 0,
viewport, 0, nearCoords, 0);
gluUnProject(x, realY, 1.0f, mg.mModelView, 0, mg.mProjection, 0,
viewport, 0, farCoords, 0);
mEngine.RespondToClickRay(nearCoords, farCoords);
}
В OGL10 AFAIK у вас нет доступа к Z-буферу, поэтому вы не можете найти Z ближайшего объекта на экране координаты x, y.
Вам нужно самостоятельно рассчитать первый объект, попавший под ваш луч.