Получение точки на плоскости y = 0 из координат мыши без использования вызовов OpenGL - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть:

  • координаты экрана x, y (0,0 - середина экрана, 1,1 - верхний левый угол)
  • размеры экрана
  • вектор местоположения камеры
  • вектор вида камеры
  • матрица проекции
  • матрица ModelView
  • y = 0 Нормаль плоскости (0,1,0,0)
  • y = 0 плоскость местоположения (0,0,0,0)

И ищу, чтобы получить местоположение (x, 0, z) на y = 0плоскость, в которой я щелкаю свое окно (должно быть пересечением линии с плоскостью, но должно учитывать свойства камеры).

К сожалению, у меня нет доступа к вызовам GLU для непроектирования иподобное, аналогичное, похожее.Просто базовые векторные и матричные расчеты.Мне на самом деле не нужен точный код как таковой, а просто техника - пересечение прямой линии достаточно просто.Трудно найти линию, которая проходит от глаза до точки на экране.

Я думал, что он просто использует вектор взгляда камеры для луча, проецируемого из местоположения камеры, но это не учитывает координаты мыши.Так что мне нужно учитывать FOV камеры тоже?

1 Ответ

2 голосов
/ 09 декабря 2011
// get line of sight through mouse cursor

GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
GLint realy;  /*  OpenGL y coordinate position  */
GLdouble wx, wy, wz;  /*  returned world x, y, z coords  */
GLdouble wx2, wy2, wz2;  /*  returned world x, y, z coords  */
glGetIntegerv (GL_VIEWPORT, viewport);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
/*  note viewport[3] is height of window in pixels  */
realy = viewport[3] - (GLint) point.y - 1;
gluUnProject ((GLdouble) point.x, (GLdouble) realy, 0.0,
    mvmatrix, projmatrix, viewport, &wx, &wy, &wz);
//printf ("World coords at z=0.0 are (%f, %f, %f)\n",
//  wx, wy, wz);
gluUnProject ((GLdouble) point.x, (GLdouble) realy, 1.0,
    mvmatrix, projmatrix, viewport, &wx2, &wy2, &wz2);
//printf ("World coords at z=1.0 are (%f, %f, %f)\n",     
//  wx, wy, wz);

// line of sight intersection with y = 0 plane

double f = wy / ( wy2 - wy );
double x2d = wx - f * (wx2 - wx );
double z2d = wz - f * (wz2 - wz );

point.x, point.y - это координаты экрана мыши, 0.0 - вверху слева.

Код предполагает, что плоскость y = 0 заполняет область просмотра.(Вы смотрите на мир из узкого воздушного порта и не видите неба.) Если плоскость y = 0 НЕ заполняет порт обзора, вы должны проверить, находится ли местоположение x, y в небе.'(wy2 - wy

...