| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Два вопроса по OpenGL. |
| Автор: OlegIT 21.12.2007, 09:12 |
| Первый вопрос. Есть сцена с несколькими объектами. Как определить над каким объектом находится курсор, учитывая глубину? Второй. Такая же сцена, построенная с проекцией glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(a,b,c,d,e,f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,40,0,0,0,0,0,-1,-1); Как спроецировать координаты курсора на одну из координатных плоскостей сцены, найти координаты точки (в моём случае плоскость X-Z)? Может есть готовые алгоритмы решения этих задач? |
| Автор: baldina 21.12.2007, 10:35 |
| см. http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/unproject.html, http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rendermode.html |
| Автор: OlegIT 21.12.2007, 11:16 |
| Спасибо. Буду разбираться. |
| Автор: OlegIT 25.12.2007, 09:14 |
| Странно они как-то работают. Например, при таких условиях: glViewport(0,0,642,549); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-12.84,12.84,-10.98,10.98,-10000.,10000.); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,40,0,0,0,0,0,-1,-1); из функции gluUnProject(325,276,0,…) получаю следующие данные (325,276 – координаты курсора) objx = 0.16; objy = 10040.00025; objz = -0.0599; Значения objx и objz правильные, но знак у objz обратный (меняю его и всё работает как надо) objy не понятно что за величина, я её не использую, но откуда такое значение? В случае переспективной проекции: glViewport(0,0,X,Y); glEnable(GL_DEPTH_TEST); glDisable(GL_DITHER); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(m_AngleLook,aspect,1.,1000.); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(m_LookX,m_LookY,m_LookZ,m_ScX,m_ScY,m_ScX,0.,1.,0.); значения objx, objy, objz, при изменении координат курсора, вообще не меняютя. Что то я тут не понимаю. |
| Автор: baldina 25.12.2007, 14:56 | ||
у тебя в gluLookAt вектор по Z=-1 кстати обрати внимание, что в OpenGL и Win направление экранного Y противоположное |
| Автор: OlegIT 25.12.2007, 17:10 |
| -- в OpenGL и Win направление экранного Y противоположное – да, правильно, упустил я это. А как быть с перспективной проекцией? И по поводу первого вопроса. Есть сцена с несколькими объектами. Как определить над каким объектом находится курсор, учитывая глубину? Надо glRenderMode (GL_SELECT) применить? Как? Извиняюсь, но чего то торможу |
| Автор: baldina 25.12.2007, 17:33 | ||
меня несколько смущает, что для ортогональной и перспективной проекций код выглядит немного по разному. принципиальных отличий между проекциями нет; разница только в матрице трансформации. gluUnProject извлекает матрицы трансформации (MODELVIEW и PROJECTION) и производит обратную трансформацию. Т.е. это в принципе можно сделать вручную, чуда тут нет чему равны численные значения параметров glViewport, gluPerspective, gluLookAt? похоже, что при изменении экранных координат координаты модели практически не меняются (из-за масштаба) |
| Автор: OlegIT 25.12.2007, 19:32 |
| Я понимаю, что чуда нет, но ручками делать не хочется, тем более есть соответствующие функции, только понять как их правильно применить. Путаюсь пока. Может есть где примеры по моим двум вопросам? |
| Автор: baldina 26.12.2007, 00:21 |
| http://www.glprogramming.com/red/chapter03.html#name9 |
| Автор: Rickert 31.12.2007, 22:19 |
| Поиском пользуйтесь. Уже отвечал на этот вопрос лично 8) |