OpenGL: gluUnProject возвращает неправильные координаты - PullRequest
1 голос
/ 28 марта 2012

Я настроил свою сцену (приложение для 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 (как упомянуто выше).

1 Ответ

5 голосов
/ 29 марта 2012

Давайте посмотрим - я не смог воспроизвести значения, которые вы получили, однако я думаю, что это не имеет значения.

Вы не должны вызывать unproject с z-значениями, не входящими в [-1;+1]. Первое, что нужно сделать unproject, это перевернуть оконное преобразование, и после этого координаты должны быть в NDC-пространстве. В OpenGL это куб [-1;+1]^3 ( songho содержит хорошую графику). Вызов unproject с -30 означает, что точка должна быть перед ближней плоскостью. Вызов его с z=-1.0f приводит к ближней плоскости, а z=+1.0f в дальней плоскости.

Как выбрать z с.т. после всех инверсий матрицы z=-30 имеет место - я не знаю.

...