Сбор лучей с помощью gluUnProject () в мировые координаты - PullRequest
1 голос
/ 11 февраля 2011

Я создал сцену, используя:

glViewport(0,0,screen->w,screen->h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
const float wh = (float)screen->w/(float)screen->h;
gluPerspective(zoom,wh,1,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-3); // puts model inside z-range

Позже, когда пользователь щелкает, я хочу вычислить луч в мировых координатах для моего теста пересечения ( не с использованием glReadPixels() для получения z):

double mv[16], p[16], a, b, c, d, e, f;
glGetDoublev(GL_MODELVIEW_MATRIX,mv);
glGetDoublev(GL_PROJECTION_MATRIX,p);
matrix_t _mv, _p;
glGetFloatv(GL_MODELVIEW_MATRIX,_mv.f);
glGetFloatv(GL_PROJECTION_MATRIX,_p.f);
const matrix_t inv = (_p*_mv).inverse();
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT,viewport);
gluUnProject(x,viewport[3]-y,0,mv,p,viewport,&a,&b,&c);
const vec_t origin(vec_t(a,b,c)*inv);
gluUnProject(x,viewport[3]-y,1,mv,p,viewport,&d,&e,&f);
const vec_t dest(vec_t(d,e,f)*inv);
ray_t ray(origin,dest-origin);

К сожалению, я неправильно понимаю, как преобразовать луч из координат камеры в мировые координаты - мой луч отсутствует.

Как правильно преобразовать луч в мировые координаты?

1 Ответ

1 голос
/ 25 апреля 2011

Мой ответ на подобный вопрос может оказаться полезным.

Нажмите, чтобы увеличить WebGL

Этот ответ относится к WebGL и Javascript. Я не работаю в C ++ и OpenGL. но, глядя на ваш код, я думаю, что gluUnproject уже использует обратные матрицы p и mv. Таким образом, вы умножаете результат на inv излишне, и, вероятно, это портит ваш результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...