gluProject Преобразование 3D-координат в 2D-координаты не позволяет правильно преобразовать 2D-координату Y
После двух часов поиска в Google (Вот, Вот, Вот, Вот, а такжеВоти множество других, которые я не потрудился найти), я подумал, что наконец-то выучил теорию превращения трехмерных координат в двухмерные. Но это не работает. Идея состоит в том, чтобы перевести трехмерные координаты корабля в двухмерные координаты на экране, чтобы отобразить имя пользователя игрока, управляющего этим кораблем.
Тем не менее, текст отображается в неправильном месте:
Текст «Тест || 2DXCoordinate || 2DZCoordinate».
Вот мойgetScreenCoords()
- который преобразует 3D-координаты в 2D.
public static int[] getScreenCoords(double x, double y, double z) {
FloatBuffer screenCoords = BufferUtils.createFloatBuffer(4);
IntBuffer viewport = BufferUtils.createIntBuffer(16);
FloatBuffer modelView = BufferUtils.createFloatBuffer(16);
FloatBuffer projection = BufferUtils.createFloatBuffer(16);
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelView);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);
GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);
boolean result = GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords);
if (result) {
return new int[] { (int) screenCoords.get(0), (int) screenCoords.get(1) };
}
return null;
}
screenCoords.get (0) возвращает идеальную X-координату. Тем не менее, screenCoords.get (1) будет увеличиваться или уменьшаться в зависимости от того, как далеко я от корабля. После многих часов отладки я сузил это до этой строки, являющейся неправильной:
GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords);
Тем не менее, я понятия не имею, что не так. Координата X корабля в порядке .... Почему не Y?
Согласно ответу BDL, я поставляю «неправильную матрицу» в gluProject (). Но я не понимаю, как это возможно, так как я вызываю метод сразу после рендеринга своего корабля (что, очевидно, находится в любой матрице, которая рисует корабль).
Я просто не могу понять, что не так.
Примечание: ответ BDL совершенно адекватен, за исключением того, что он не объясняет, почему координаты Y неверны.
Примечание. Раньше этот вопрос был намного длиннее и гораздо более расплывчатым. Я разместил свой суженный вопрос выше после часов отладки.