Название: выделение объектов мышью без glPerspective Отправлено: deMax от Май 28, 2015, 13:39 Для старого кода в стиле glTrandlate/rotate было сделать просто: gluUnProject (http://morgeyz.narod.ru/mouse.htm)
Теперь в программе используется QOpenGLFunctions::glUseProgram, камера через: QMatrix4x4 modelView; modelView.perspective( angleView, ratio , 0.1f, 100.0f ); Название: Re: выделение объектов мышью без glPerspective Отправлено: __Heaven__ от Май 28, 2015, 18:33 не пользовался этой функцией, но предполагаю, что вы можете развернуть свою матрицу в const GLdouble modelMatrix[16], а вместо перспективной использовать единичную. Таким образом функция сработает.
С моей стороны есть пара замечаний: Код Так делать не айс. Лучше разделять проекцию от модели: Код В программу, которую прикручиваете с помощью glUseProgram теперь будем подставлять modelViewProject вместо modelView. Соответственно, все повороты, транслэйты делать только с modelView. При данном подходе можно воспользоваться и gluUnProject без лишних придумываний. P.S.: А ещё лучше, имхо, найти обратную матрицу modelViewProject, найти координаты тыка в диапозонах [-1..1] и перемножить эти величины. То и будет ваши истинные координаты. Название: Re: выделение объектов мышью без glPerspective Отправлено: deMax от Июнь 02, 2015, 13:00 В принципе есть вариант отслеживать буфер глубины по пикселю под мышой, последний объект после которого этот буфер изменился и есть искомый.
Добавил одну функцию glReadPixels(vx, vy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &vz); и время отрисовки кадра изменилось с 0-1ms до 13ms. >>С моей стороны есть пара замечаний: Это прототип, у меня вообще наоборот все получается камера генирирует матрицу перспективы Мп и умножает ее на Мв (матрицу вида), результат отдает модели. Модель результат умножает на матрицу модели Мм, и отдает частям, те умножают на свои матицы Мч (в произвольной вложенности) и в конце эти матрицы записываются в части с текстурами. Новые координаты получаются Мп*Мв*Мм*Мч*QVector3D(), так как это равно в связи с ассоциативностью матриц этому Мп * (Мв * (Мм * (Мч * QVector3D()))). Название: Re: выделение объектов мышью без glPerspective Отправлено: __Heaven__ от Июнь 02, 2015, 13:08 glReadPixels, имхо, может в будущем сыграть злую шутку. Вдруг вы захотите чистить буфер.
В любом случае вы можете размотать любой пиксель в исходный QVector3D. Ну, дело ваше, как сделать :) Название: Re: выделение объектов мышью без glPerspective Отправлено: Igors от Июнь 02, 2015, 14:11 В принципе есть вариант отслеживать буфер глубины по пикселю под мышой, последний объект после которого этот буфер изменился и есть искомый. Не связывайтесь с glReadPixels, это будет вечный геморрой пока весь этот код не уберете.Добавил одну функцию glReadPixels(vx, vy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &vz); и время отрисовки кадра изменилось с 0-1ms до 13ms. Выбор на уровне объектов - далеко не худшее в OpenGL. Вот примерчик (http://masandilov.ru/opengl/object-selection). Можно ли так делать "в новом стиле" - хз, я пока с переходом на это новое не спешу. Вообще у Вас доступны вызовы glUnProject и.т.п,? Если да то нужные матрицы найдем (в крайнем случае на вокзале :)) Название: Re: выделение объектов мышью без glPerspective Отправлено: deMax от Июнь 02, 2015, 16:14 glReadPixels, имхо, может в будущем сыграть злую шутку. Вдруг вы захотите чистить буфер. У меня солнце, луна, земля рисуется, после каждого объекта сбрасываю буфер глубины. Цитировать В любом случае вы можете размотать любой пиксель в исходный QVector3D. Ну, дело ваше, как сделать :) А как соотнести его с деталью по которой кликнули мышью? Перебор полигонов?Название: Re: выделение объектов мышью без glPerspective Отправлено: __Heaven__ от Июнь 02, 2015, 16:39 В моих задачах мне необходимо вычислять кликнутый полигон. Поэтому делаю перебор. Это быстро и без использования gpu.
Быть может, если объекты простые, как сфера, то можно вычислять точку пересечения клика с каждой из сфер. Название: Re: выделение объектов мышью без glPerspective Отправлено: Igors от Июнь 02, 2015, 16:50 Кстати о птичках
Новые координаты получаются Мп*Мв*Мм*Мч*QVector3D(), так как это равно в связи с ассоциативностью матриц этому Мп * (Мв * (Мм * (Мч * QVector3D()))). Это верно для матриц как они в математике. OpenGL трактует матрицу ширше, напр впихнули туда и перспективу. Поэтому ассоциативность может и не соблюдаться.В любом случае вы можете размотать любой пиксель в исходный QVector3D. Координату можно перевести в пиксель (не всегда), но из пикселя можно получить только 2 значения, 3-e (расстояние до цели) не определено. Др словами можно получить только вектор, направление Самый простой (и самый тупой) способ - найти вектор камера-цель в мире и парить полигон за полигоном odd-even. Название: Re: выделение объектов мышью без glPerspective Отправлено: __Heaven__ от Июнь 02, 2015, 17:54 3-e да, нужно сканировать путь клика и искать пересечение. Я занимаюсь этим - достаточно дешёвая операция.
Название: Re: выделение объектов мышью без glPerspective Отправлено: Igors от Июнь 02, 2015, 18:27 3-e да, нужно сканировать путь клика и искать пересечение. Я занимаюсь этим - достаточно дешёвая операция. Она совсем не дешевая, спасает то что она разоваяДумается этим приходится заниматься каждому кто хоть как-то работает с OpenGL. И вот мне непонятно, ну вот как же так - снимают с клиента сотни баксов за крутую карту, уверяют что OpenGL - светлое будущее человечества. Но... если бы я спросил на плюсах "а как сделать массив переменной длины" - через 2 минуты меня бы ткнули носом в std::vector - и это правильно. А здесь (на OpenGL) для совершенно типовой задачи - стандартного решения нема, все велосипедят. Кстати спрашивал на gamedev (где в лесах много диких обезьян) - ну правда меня интересовал выбор вертексов и фейсов (а не объектов). Ответ по существу: "ну вы как-то это сами сделайте" :) ппц В общем OpenGL = "Блеск и нищета куртизанок" Название: Re: выделение объектов мышью без glPerspective Отправлено: deMax от Июнь 03, 2015, 12:43 Это верно для матриц как они в математике. OpenGL трактует матрицу ширше, напр впихнули туда и перспективу. Поэтому ассоциативность может и не соблюдаться. перспектика и натягивание почти единичного куба на экранные координаты делаются вне матричного преобразования. Матрица подготавливает координаты, под легкий просчет перспективы.А если через стенсил буфер пронумеровать все детали? Например я вожу мышкой по модели, а он отображает вспомогательную информацию о детали под курсором? Правда меня смущает падение fps при использовании glReadPixels(почему?), но можно ограничить вызовы - только один раз после остановки курсора на Х мл.сек. через 2 минуты меня бы ткнули носом в std::vector - и это правильно. От задачи зависит, где то и список лучше будет, а где то new/delete. Тем не менее велосипеды уже есть, выбирай и пользуйся. Qt в этом плане молодцы, столько хороших велосипедиков написали.А здесь (на OpenGL) для совершенно типовой задачи - стандартного решения нема, все велосипедят. Ага, вот бы QGlWidget::getObject(x,y, номер способа).Кстати спрашивал на gamedev (где в лесах много диких обезьян) - ну правда меня интересовал выбор вертексов и фейсов (а не объектов). Ответ по существу: "ну вы как-то это сами сделайте" :) ппц В общем OpenGL = "Блеск и нищета куртизанок" |