Координатная система OpenGL и курсор

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Координатная система OpenGL и курсор

Сообщение Admiralisimys » 16.11.2012 (Пт) 23:59

Здравствуйте.

Есть OpenGL программа (GLUT, freeGlut, OpenGlut использовать нельзя, не говоря о том что б перейти на OpenGL 2+, только то что предоставлено в папке GL в Windows SDK) для которой нужно организовать ввод.
Я в курсе что в OpenGL используется привычная с геометрии декартовая система координат (в этом случаи, для окна в ОС Windows ноль будет левый нижний угол), в отличии от принятой в Windows системы координат с нулём в верхнем левом углу.
OpenGL_and_GDI_StartPoint.png

По X согласие, разночтение лишь по Y, которое довольно просто разрешить для OpenGL окна
Код: Выделить всё
case WM_MOUSEMOVE:
   manager -> OnMouseMove((int)wParam, LOWORD(lParam), GetHeight() - HIWORD(lParam));
   break;

Но что же происходит когда перейти в правый нижний угол?
В случаи с GDI как и ожидалось.
GDI_RightBottomPoint.png

Но почему для OpenGL случая есть расхождения?
OpenGL_RightBottomPoint.png

Что я упускаю?
Даже если допустить использование сторонней библиотеки freeGlut, ситуация с координатами не улучшится, единственно что цвета для OpenGL объектов можно будет задавать.
В приложенном иллюстрирующем примере
OpenGL_and_GDI_src.zip

работа с цветом не показана, но откуда (в случаи OpenGL) вообще там взялся красный цвет?

Спасибо.
У вас нет доступа для просмотра вложений в этом сообщении.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Координатная система OpenGL и курсор

Сообщение FireFenix » 17.11.2012 (Сб) 2:21

Есть мнение, что проблема в бордере, попробуй для ОГЛ отними разницу между клиентской частью и окном при вычилсении матрицы вида
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Координатная система OpenGL и курсор

Сообщение Admiralisimys » 17.11.2012 (Сб) 3:44

FireFenix точно!
OpenGL_AndPopUpWindow.png

Код: Выделить всё
//проверка в окне без бордеров
std::auto_ptr<GLWindow> winGL(new GLWindow);
winGL -> SetStyles(WS_POPUP);//WS_SYSMENU);

Спасибо.

Но я был убеждён, что данные казусы должна брать на себя функция AdjustWindowRect(Ex) (для тех кто скачал вложение, исправьте там (&rc, m_dwStyle, FALSE, m_dwStyleEx);), которая по заказанному размеру кадра (она же клиентская область) рассчитывает размер всего окна с бордерами.
Во всяком случаи для DirectDraw/Direct3D так. Ну и GDI это не мешает правильно отработать.

P.S.
Замена стиля на WS_OVERLAPPEDWINDOW решает вопрос
OpenGL_And_OverlappedWindow.png

AdjustWindowRect(Ex) оставляет переменную rc (типа RECT) без изменения для WS_POPUP, соответственно в OpenGL передаётся размер матрицы вида с включёнными размерами всего окна, вместе с бордерами, а не размер лишь клиентской области.

P.S.S.
Ну, а для воспроизведения визуальной идентичности WS_POPUP можно воспользоваться комбинацией WS_CAPTION | WS_SYSMENU
У вас нет доступа для просмотра вложений в этом сообщении.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

    TopList