Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

OpenGL, MFC, координаты. Срочно!

289
21 февраля 2005 года
Jeyson
207 / / 20.04.2000
Доброго времени суток. Опять проблемы. Пишу CAD систему. Проблема самая тупая (или нет). Нужно нарисовать к примеру линию по щелчку мыши. Как всем известно, координаты экрана отсчитываются от верхнего левого угла (0,0) и увеличиваются до размера разрешения экрана. У OpenGL координата (0,0) находится в центре окна приложения, при этом края экрана соответствуют 1 или -1. Как преобразовать экранные координаты в координаты OpenGL? Мож маленько коряво выразился. Кстати для смещения и масштабирования изображения пользуюсь gluLookAt(9 параметров). А это тоже сыграет определенную роль. Пока имею следующее, пытаюсь преобразовать в координаты OpenGL экранные координаты мыши. Это явно работает не так.
void CTraceView::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect clientRect;
GetClientRect(&clientRect);
// TODO: Add your message handler code here and/or call default


MouseX1=(float)point.x/clientRect.right;
MouseY1=(float)point.y/clientRect.bottom-0.5;
CView::OnLButtonDown(nFlags, point);
}

Надо получить координаты OpenGL. Например рисую линию,
glBegin (GL_LINES);
glVertex3f (-1,-1,0);
glVertex3f (1,1,0);
glEnd();

кликаю мышью на край линии и в MouseY1 и в MouseX1 должны записаться координаты либо -1, -1 или 1,1 в зависимости от конца линии. Этого не происходит. Использование gluLookAt(9 параметров) эту проблему усугубляет. Что делать???? Заранее благодарен.
368
21 февраля 2005 года
rostyslav
629 / / 13.07.2004
Попробуй
 
Код:
void CTraceView::OnLButtonDown(UINT nFlags, CPoint point)
{
  CRect clientRect;
  GetClientRect(&clientRect);

  MouseX1=-1+(float)point.x/(float)clientRect.Width()*2;
  MouseY1=-1+(float)point.y/(float)clientRect.Height()*2;
}
289
21 февраля 2005 года
Jeyson
207 / / 20.04.2000
Все это не совсем так. Получается маленько не то. Надо еще учесть gluLookAt. И даже эти значения не правильные. Но спасибо
259
21 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by Jeyson
Все это не совсем так. Получается маленько не то. Надо еще учесть gluLookAt. И даже эти значения не правильные. Но спасибо


В Builder есть функция LPtoDP.
The LPtoDP function converts logical coordinates into device coordinates. The conversion depends on the mapping mode of the device context, the settings of the origins and extents for the window and viewport, and the world transformation.

BOOL LPtoDP(

HDC hdc, // handle of device context
LPPOINT lpPoints, // array of points
int nCount // count of points
);


Parameters

hdc

Identifies the DC.

lpPoints

Points to an array of POINT structures. The x-coordinates and y-coordinates contained in each of the POINT structures will be transformed.

nCount

Specifies the number of points in the array.



Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.

Remarks

This function fails if the logical coordinates exceed 32 bits, or if the converted device coordinates exceed 27 bits. In the case of such an overflow, the results for all the points are undefined.

See Also

DPtoLP, POINT

368
21 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Jeyson
Все это не совсем так. Получается маленько не то. Надо еще учесть gluLookAt. И даже эти значения не правильные. Но спасибо

Если левая верхняя точка в координатах OpenGL (-1,1), тогда

MouseX1=-1+(float)point.x/(float)clientRect.Width()*2;
MouseY1=1-(float)point.y/(float)clientRect.Height()*2;

Но а, gluLookAt, это уже тебе нужно учесть.

289
22 февраля 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by rostyslav
Если левая верхняя точка в координатах OpenGL (-1,1), тогда

MouseX1=-1+(float)point.x/(float)clientRect.Width()*2;
MouseY1=1-(float)point.y/(float)clientRect.Height()*2;

Но а, gluLookAt, это уже тебе нужно учесть.



Да это вроде работает (по краайней мере на бумаге), спасибо. Но мож кто знает как это работает с gluLookAt. Я изменяю в ней третий параметр (удаление глаза по оси Z). Естественно, приведенные формулы будут уже не верны.

1.9K
22 февраля 2005 года
Goblin
55 / / 02.03.2004
Мож это поможет?
http://www.gamedev.ru/articles/?id=20101
289
24 февраля 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Goblin
Мож это поможет?
http://www.gamedev.ru/articles/?id=20101



Спасибо, это должно было помочь, но на самом деле новые проблемы. НЕ могу понять в чем ошибка. В режиме отладки просматриваю переменные &wx, &wy, &wz в них храняться совершенно дикие значения.
void CTraceView::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect clientRect;
GetClientRect(&clientRect);
InvalidateRect(NULL, FALSE);


GLint viewport[4];
GLdouble projection[16];
GLdouble modelview[16];
GLdouble vx,vy,vz;
GLdouble wx,wy,wz;

glGetIntegerv(GL_VIEWPORT,viewport);
glGetDoublev(GL_PROJECTION_MATRIX,projection);
glGetDoublev(GL_MODELVIEW_MATRIX,modelview);
vx = point.x;
vy = clientRect.bottom - point.y - 1;
vz = -1;
gluUnProject((GLdouble)vx, (GLdouble)vy, 0.0, odelview, projection, viewport, &wx, &wy, &wz);
CView::OnLButtonDown(nFlags, point);
}

Уже обшарил много сайтов на эту тему, но "догнать" не могу нифига. Файл прикрепил. Посмотрите пожалуйста в чем дело. Это принципиально важная для меня проблема.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог