Почему gluUnProject(), похоже, не работает?

#java #opengl

#java #opengl

Вопрос:

Я пытаюсь найти координаты моей мыши на плоской 3D-поверхности. Немного погуглив по этому поводу, я выяснил, что для этого вы используете gluUnProject. Итак, я это реализовал. Вот мой код (при удалении частей, которые не интересны):

 public class Input {
private FloatBuffer modelView = BufferUtils.createFloatBuffer(16);
private FloatBuffer projection = BufferUtils.createFloatBuffer(16);
private IntBuffer viewport = BufferUtils.createIntBuffer(16);
private FloatBuffer location = BufferUtils.createFloatBuffer(3);
private FloatBuffer winZ = BufferUtils.createFloatBuffer(1);

public float[] getMapCoords(int x, int y)
{
    modelView.clear().rewind();
    projection.clear().rewind();
    viewport.clear().rewind();
    location.clear().rewind();
    winZ.clear().rewind();

    glGetFloat(GL_MODELVIEW_MATRIX, modelView);
    glGetFloat(GL_PROJECTION_MATRIX, projection);
    glGetInteger(GL_VIEWPORT, viewport);

    float winX = (float)x;
    float winY = (float)viewport.get(3) - (float)y;

    glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ);
    gluUnProject(winX, winY, winZ.get(0), modelView, projection, viewport, location);
    return new float[] {location.get(0), location.get(1), location.get(2)};
}
}
  

Когда я вызываю эту функцию, передавая координаты X и Y мыши, я получаю некоторые числа, которые увеличиваются на 100 для каждого пикселя, который я перемещаю с помощью мыши (это должно быть около 1). Выполнив несколько отпечатков из различных переменных, я обнаружил, что буфер winZ содержит значение 1.0. Мой gluPerspective настроен таким образом, что его ближняя точка отсечения равна 0.1, а дальняя — 10000, что объясняет, почему это число так быстро увеличивается. Тем не менее, я не знаю, как заставить OpenGL использовать мою плоскую плоскость вместо этого для нахождения этого расстояния.

Итак, теперь мне интересно; если это правильный / лучший / самый простой метод для нахождения координат мыши на поверхности в 3D мире, что я мог делать неправильно? Если это не так, какой лучший способ сделать это?

Ответ №1:

Да, это правильный метод для использования. Вероятно, вы просто вызываете его в точке, где матрицы не содержат «хороших значений» (возможно, это вызвано функциями glPush / PopMatrix() в вашем коде).

Чтобы подтвердить, что вы получаете правильные координаты, нарисуйте одну GL_POINT в полученных координатах после их получения (отключите проверку глубины и увеличьте размер точки, скажем, до 10 пикселей). Если точка перемещается под вашей мышью, то вычисленные координаты верны, а матрицы — нет.

Комментарии:

1. На самом деле я решил это сам довольно давно. На самом деле я не могу вспомнить, как, но в любом случае у меня есть некоторая репутация 🙂

2. спасибо 🙂 в следующий раз попробуйте опубликовать решение для других. кроме того, это пометило бы ваш вопрос как «отвеченный» и удалило бы его из списка вопросов без ответов, что хорошо.