Я получаю некоторые проблемы с gluUnProject, потому что получаю неточную координату Z.
Привлекательная программа - это, в основном, 3D-просмотрщик. Я реализовал небольшую функцию, позволяющую пользователю щелкнуть по загруженной модели и получить расстояние между двумя точками.
Это код:
// Declare variables for viewport, modelview and projection matrix
int viewport[] = new int[4];
float modelview[] = new float[16];
float projection[] = new float[16];
// GL y-coordinate position
int realY;
// Returned [wx, wy, wz, 1] coordinates
float worldCoordinates[] = new float[4];
gl2.glGetIntegerv(GL2.GL_VIEWPORT, viewport, 0);
gl2.glGetFloatv(GL2.GL_MODELVIEW_MATRIX, modelview, 0);
gl2.glGetFloatv(GL2.GL_PROJECTION_MATRIX, projection, 0);
// Retrive the Y coordinate, note viewport[3] is height of window in pixels
realY = viewport[3] - click.y - 1;
// Allocate a buffer to store the result
FloatBuffer fb = FloatBuffer.allocate(1);
// Retrieve the Z coordinate, read a block of pixels from the frame buffer
gl2.glReadPixels(click.x, realY, 1, 1, GL2.GL_DEPTH_COMPONENT, GL2.GL_FLOAT, fb);
System.out.println("Depth: "+fb.get(0));
// Avoid centering if the click is on nothing
if (fb.get(0) == 1.0f) {
return null;
}
// Map window coordinates to object coordinates, retrieve the world coordinates
glu.gluUnProject(click.x, realY, fb.get(0), modelview, 0, projection, 0,
viewport, 0, worldCoordinates, 0);
Когда я измеряю расстояние между двумя точками, лежащими на поверхности, перпендикулярной пользователю, все работает правильно. Если мы изображаем систему с тремя осями, причем z указывает на пользователя, а y - вверх, две точки лежат на плоскости XY. Он работает независимо от вращения вокруг Z.

Например, здесь я создал небольшую квадратную плоскость, и обе точки имеют одинаковую высоту (одна затенена меткой):
Мировые координаты P1: (0,019062456, 0.03357359, 0.08333321, 1)
Координаты мира P2: (0,025983132, 0.028048635, 0.08333321, 1)
Но если я поворачиваю всю сцену по глобальным осям X, то измененные координаты Z меняются:

Координаты X и Y не имеют значения, что важно для Z. Это не более 0.08333321.
Мировые координаты P1: (0.026863147, 0.027185505, 0.0831252, 1)
Мировые координаты P2: (0.020072304, 0.034560144, 0.08312501, 1)
Более того, после поворота по глобальному X масштабирование влияет на координату Z точек.
Ps: Я использую JOGL. Увеличение и уменьшение масштаба выполняется путем увеличения/уменьшения параллелепипеда glOrtho. Глубина Z, создаваемая glReadPixels, fb.get (0), включена в [0, 1].
Где я ошибаюсь?