Я настроил свою сцену (приложение для Android, OpenGL ES) следующим образом:
GLU.gluPerspective(gl, 60, viewRatio, 0.1f, 1000.0f);
// ...
GLU.gluLookAt(gl, cameraX, cameraY, cameraZ, cameraX, cameraY, cameraZ - 1f, 0f, 1f, 0f);
// Scene scaled down because object positions are in [-10000..10000] for x & y
gl.glScalef(0.001f, 0.001f, 1.0f);
Сцена отрисована хорошо, она содержит четырехугольники в z = -10 и один гигантский фоновый квад в z = -30.Я сейчас пытаюсь реализовать выбор лучей, как это (взято из этой темы :
public float[] unproject(float rx, float ry, float rz) {
float[] xyzw = {0, 0, 0, 0};
int[] viewport = {0, 0, mDisplayWidth, mDisplayHeight};
android.opengl.GLU.gluUnProject(rx, ry, rz, mMatrixGrabber.mModelView, 0, mMatrixGrabber.mProjection, 0, viewport, 0, xyzw, 0);
xyzw[0] /= xyzw[3];
xyzw[1] /= xyzw[3];
xyzw[2] /= xyzw[3];
xyzw[3] = 1;
return xyzw;
}
Затем нажмите на экран для проверки таким образом:
unproject(tapX, mDisplayHeight - tapY, BACKGROUND_Z);
Ожидаемое поведение: возвращенные координаты X, Y напоминают повернутую точку на глубине = -30 (BACKGROUND_Z)
Что на самом деле делает: возвращает правильные координаты X, Y при касании в центре экрана; но расстояние между экраномцентр и точка касания не интерпретируются правильно - кажется, что они уменьшены в некоторой степени: например, нажатие по центру экрана дает [0,0], нажатие по левому краю экрана должно давать ~ [-3600,0], но вместо этого дает[-1.13,0]. Панорамирование вида так, что ранее затронутая точка находится в центре экрана, дает ~ [-3600,0], как и должно быть.
Может ли это быть из-за масштабирования сценына 0,001? Я протестировал различные конфигурации (перемещая масштабирование до gluLookAt или полностью удаляя его), но проблема сохраняется: (
Пример вывода данных для касания на левом краю экрана:
Точка касания, переданная в unproject ():
x=3, y = 554 (0,0 at bottom left; w=720, h=1280)
Матрица проекции:
[2.8482616, 0.0, 0.0, 0.0,
0.0, 1.7320509, 0.0, 0.0,
0.0, 0.0, -1.0001999, -1.0,
0.0, 0.0, -0.20001999, 0.0]
Матрица модели:
[0.0010, 0.0, 0.0, 0.0,
0.0, 0.0010, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 1.0, 1.0]
unproject() output:
[-1.1232367, -0.11801138, -1.0032262, 1.0]
Здесь мне приходит в голову то, что возвращаемое значение z кажется неправильным - значение z, переданное в unproject (), равно -30 (как упомянуто выше).