Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата

 но знак у objz обратный 

у тебя в gluLookAt вектор по Z=-1

кстати обрати внимание, что в OpenGL и Win направление экранного Y противоположное

Автор: OlegIT 25.12.2007, 17:10
-- в OpenGL и Win направление экранного Y противоположное – да, правильно, упустил я это. А как быть с перспективной проекцией?

И по поводу первого вопроса. Есть сцена с несколькими объектами. Как определить над каким объектом находится курсор, учитывая глубину? Надо glRenderMode (GL_SELECT)  применить? Как? Извиняюсь, но чего то торможуsmile

Автор: baldina 25.12.2007, 17:33
Цитата

как быть с перспективной проекцией?


меня несколько смущает, что для ортогональной и перспективной проекций код выглядит немного по разному. 
принципиальных отличий между проекциями нет; разница только в матрице трансформации.
gluUnProject извлекает матрицы трансформации (MODELVIEW и PROJECTION) и производит обратную трансформацию. Т.е. это в принципе можно сделать вручную, чуда тут нет  smile

чему равны численные значения параметров 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)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)