Я пытаюсь найти координаты моей мыши на плоской трехмерной поверхности. Подумав немного об этом, я обнаружил, что для этого вы используете 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 использовать мою плоскость вместо того, чтобы находить это расстояние.
Так что теперь мне интересно; если это правильный / лучший / самый простой метод для определения координат мыши на поверхности в трехмерном мире, что я могу сделать неправильно? Если это не так, как лучше это сделать?