Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL - соответствие элементов сцены, и курсора мыши 
:(
    Опции темы
EKoshelev
Дата 13.8.2014, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Необходимо решить такие подзадачки:
1. На экране выведено несколько точек. Делаю тычёк мышью. Надо определить какая из точек находится к мыши ближе остальных.
2. На экране выведено несколько кубиков. Определить на какой из них указывает мышь.

Наверное есть какие-то стандартные средства для решения подобных задач. Подскажите где искать.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Amp
Дата 13.8.2014, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 2
Всего: 17



1. Вычисляешь оконные координат точек, считаешь расстояние от них до мыши.
2. Есть разные варианты. Самый топорный, простой и устаревший вариант - selection buffer.
PM MAIL   Вверх
EKoshelev
Дата 14.8.2014, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Amp

1. Я так понимаю, что для вычисления оконных координат точек нужно знать матрицу (и алгоритм рассчета). Я не знаю как матрицу достать. В ней и поворот со смещением и перспектива....

2. Спасибо, посмотрю по словам selection buffer.

3. А кроме топорного и устаревшего есть что-нибудь передовое?


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Amp
Дата 14.8.2014, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 2
Всего: 17



Оконные координаты вычисляются просто: позиция точки умножается на матрицу моделирования, затем на матрицу проекции, полученные значения приводятся к координатам вьюпорта. gluProject делает как раз эти действия. Матрицы, если ты их сам не хранишь, можешь получить через glGetFloatv.

Передового в OpenGL нет, просто выбор объектов полностью ложится на твои плечи. Например строишь луч от позиции мыши и вычисляешь его пересечение с объектами сцены. 
Есть еще достаточно простой вариант с выбором объектов по цветам http://content.gpwiki.org/index.php/OpenGL...nique_Color_IDs
PM MAIL   Вверх
EKoshelev
Дата 22.8.2014, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Вот такая функция:

Код

// По координатам точки на сцене получить её координаты на экране
void Q3dShow::getPointCoords(GLfloat fSceneX, GLfloat fSceneY, GLfloat fSceneZ, int& nX, int& nY)
{
//// Формирую матрицы (у вас будет по другому)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();      
    glMultMatrixf(transform);
    glTranslatef(offsetback[12], offsetback[13], offsetback[14]);
//// Конец формирования матрицы

    GLfloat *projection = (GLfloat *)malloc(16 * sizeof(GLfloat));
    GLfloat *modelview = (GLfloat *)malloc(16 * sizeof(GLfloat));
    GLdouble *winx = new GLdouble();
    GLdouble *winy = new GLdouble();
    GLdouble *winz = new GLdouble();

    glGetFloatv(GL_PROJECTION_MATRIX, projection);
    glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
    GLdouble pr[16], mv[16];
    for (int i = 0; i < 16; i++)
    {
        pr[i] = projection[i];
        mv[i] = modelview[i];
    }
    GLint vp[4];
    vp[0] = 0;
    vp[1] = 0;
    vp[2] = width();    // ширина окна
    vp[3] = height();    // высота окна
    gluProject(fSceneX, fSceneY, fSceneZ, mv, pr, vp, winx, winy, winz);

    nX = *winx;
    nY = height() - *winy;
}



--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
drug007
Дата 22.8.2014, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Оффтопик, конечно, но я бы под матрицы все-таки лучше бы на стеке память выделил.
PM MAIL   Вверх
EKoshelev
Дата 25.8.2014, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



drug007, мне конечно дофига стыдно, но я не знаю как это.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Alexeis
Дата 2.2.2015, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Например это

Код

GLfloat *projection = (GLfloat *)malloc(16 * sizeof(GLfloat));


заменить на 

Код

GLfloat projection[16];


Если нужен указатель не обязательно выделять память в куче, просто берем адрес переменной (оператор &), а в случае массива переменная массива и так является указателем на 1й элемент. Просто передаем переменную массива как аргумент.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1249 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.