2011-02-10 4 views
1

настроить сцену с помощью:Ray сбор с gluUnProject() в мировой системе координат

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(), чтобы получить г):

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

Возможно, вы найдете мой ответ на аналогичный вопрос полезным.

Click to zoom in WebGL

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

Смежные вопросы