Неправильное создание луча в OpenGL от щелчка мышью при нажатии на вытяжки оси X окна?

Я столкнулся с ошибкой, которую я не уверен, как исправить. Когда я нажимаю на окно, точка в трехмерном пространстве не отображается непосредственно на щелчок по оси x реального окна. Расхождение между выбранной точкой и фактическим созданием луча в трехмерном пространстве увеличивается пропорционально по мере того, как вы все дальше и дальше от середины оси X в окне. Ось у работает нормально, это просто ось х.

Вот изображение квадратов, созданных в трехмерном пространстве, где я щелкаю мышью. Я щелкнул только по краям и обошел окно. (некоторые квадраты выглядят как шестиугольники, потому что угол камеры направлен вниз, но это не важно, расстояние слева и справа равно)

пример

Вот код, который я использовал для создания луча в трехмерном пространстве по щелчку в окне:

    GLfloat window_height = 800;
GLfloat window_width  = 800;

void proccess_Mouse(int button, int state, int x, int y) {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(camera->getAngle(), window_height / window_width, viewPlane_close, viewPlane_far);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camera->getIndex_position(0), camera->getIndex_position(1),   camera->getIndex_position(2),
camera->getIndex_looking(0),  camera->getIndex_looking(1),    camera->getIndex_looking(2),
0,                                    -1,                             0);

// matrix information
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];

GLfloat winX, winY;                // clicked coords on the screen
GLdouble near_x, near_y, near_z;   // position of the mouse on the near view plane
GLdouble far_x, far_y, far_z;      // position of the mouse on the far view plane

glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);

winX = (float)x;
winY = (float)viewport[3] - (float)y; // window height - click position

gluUnProject(winX, winY, 0.0, modelview, projection, viewport, &near_x, &near_y, &near_z);
gluUnProject(winX, winY, 1.0, modelview, projection, viewport, &far_x, &far_y, &far_z);

Vector3f* near = new Vector3f(near_x, near_y, near_z);
Vector3f* far  = new Vector3f(far_x, far_y, far_z);

...
}

Я верю, что что-то упустил или что-то забыл, но я этого не вижу. Есть идеи?

2

Решение

На первый взгляд кажется, что вы передаете неправильное соотношение сторон в gluPerspective. Второй параметр должен быть ширина / высота.

3

Другие решения

Других решений пока нет …