|
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 18
|
|
Поиск местонахождения объектов в opengl. Qt07.11.2014, 18:55. Показов 7977. Ответов 58
Метки нет (Все метки)
Доброго времени суток!
Делаю программу в Кьюте, которая строит множество объектов на экране с помощью OpenGL. Эти объекты я одновременно могу масштабировать, изменяя размеры окна с помощью glOrtho(), поворачивать с помощью функции glRotate*(). Проблема заключается в том, что мне нужно при наведении курсора выяснить, на какой объект он был наведён. Не могу понять, как это реализовать. Нужно, чтобы определялась хотя бы координата этого объекта, по которой он строился. Дальше, естественно, легко определить будет, что за объект. То есть нужно, чтобы я навёл курсор, и волшебство мне выдало координаты объекта в x, y, z. Есть у кого какие соображения?
0
|
|
| 07.11.2014, 18:55 | |
|
Ответы с готовыми решениями:
58
Удаление объектов в OpenGL |
| 11.04.2024, 12:04 | ||||||
|
Удивительно то, что touchEvent() не нужен для Android'а, если не нужно отслеживать несколько касаний. В примере выше достаточно одного метода mousePressEvent(), который и так есть для Desktop и WASM, а touchEvent() нужно убрать:
0
|
||||||
| 11.04.2024, 13:26 | |||||||||||||||||
|
Написал очень короткий пример, где выводится простейший треугольник (без model/view/projection матриц) с выводом цвета полученным с помощью glReadPixels. Протестировал пример на реальном смартфоне и на эмуляторе. Записал gif-анимацию с эмулятора. Здесь движно, что когда происходит касание с треугольников, то выводится красный цвет в консоль (1, 0, 0), а если по фону, то выводится серый цвет (0.2, 0.2, 0.2). Важно использовать QWindow::devicePixelRatio(). Это отношение размера физического пикселя к "независимому" размеру пикселя устройства. В документации написано, что:
Важно помнить, что glReadPixels считает, что начало координат в нижнем левом углу, а mousePressEvent - в верхнем левом углу, поэтому по Y координата по Y переворачивается:
Исходники в одном файле: main.cpp
0
|
|||||||||||||||||
| 11.04.2024, 14:48 | |
|
В общем случае команды рисования (glDrawArrays и др) не гарантируют "готовности" пикселей, нужно юзать glFinish/glFlush
Если "вот так все просто" (glReadPixels) - это должно насторожить. Покрутите в уме разные варианты выборки. Напр если примитивов много - нужно дать возможность выбрать их "рамкой" (которую еще надо подсвечивать). Конечно "это уже другая задача", но если Вы заявляете "я умею выбирать.." - ее тоже придется делать. В общем, с упоением рисовать красный треугольник - дело хорошее, но..
0
|
|
| 24.05.2024, 15:04 | ||||||||||||
|
В коротком примере ниже выводится красный треугольник. По клику выводится цвет пикселя в месте клика. В данным момент значение цвета выводится в консоль с задержкой в 5 секунд для glFinish, а если заменить glFinish на glFlush, то задержки нет. Можете скачать пример и потестить: pro
0
|
||||||||||||
| 24.05.2024, 15:26 | ||||||
|
Забыл прикрепить пример выше в архиве. Чтобы появилась задержка в выводе значения цвета в консоль нужно раскомментировать glFinish и закомментировать glFlush перед glReadPixels, вот так:
0
|
||||||
| 25.05.2024, 09:04 | ||
По своему опыту особых задержек glFinish не замечал, не говоря уже о 5 сек, ну это всего лишь "моя машина/карта". Ситуации когда glFinish необходим ("не успело отрисовать") были при массивном рисовании. Если можно прочитать цвет после swapBuffers, то glFinish не нужен. В Вашем примере это решается напр сигналом с QueuedConnection.Ваши примеры так перегибают палку с "простотой" что теряется всякий смысл. Показать glReadPixels - слишком мало, к тому же читать надо не этой ф-цией. Решили выбирать цветом - ладно. Но тогда рендерите в текстуру, кодируйте ID объекта + ID примитива. Заодно освоите геометрические шейдеры. Передрать пример должно быть выгодно/заманчиво, иначе нафиг он нужен
0
|
||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
|
|||
| 27.05.2024, 10:06 | |||
|
1
|
|||
| 27.05.2024, 11:44 | ||||||||
0
|
||||||||
| 27.05.2024, 22:07 | ||||||||||
0
|
||||||||||
|
Модератор
|
|
| 27.05.2024, 22:15 | |
|
По сути ведь не обязательно же ждать завершения рисования. Можно брать значения предыдущих кадров до очистки экрана. Только с 2 буферами задержка будет если не ошибаюсь в 2 кадра, но даже при 30 кадрах это очень мало и не заметно человеческому глазу, а на экране все не успеет кардинально измениться, да и обычно где есть выбор нету ничего динамического.
0
|
|
| 27.05.2024, 22:26 | |||
|
Не по теме: Сейчас опять начнется
0
|
|||
|
Модератор
|
||
| 27.05.2024, 22:44 | ||
|
Я у себя выбор обычно делаю через тест трафарета, тоже glReadPixels, но с GL_STENCIL_INDEX и GL_INT, диапазон сильно меньше чем в цветах, но тоже имеет место быть.
0
|
||
| 27.05.2024, 23:06 | ||||||||
0
|
||||||||
| 27.05.2024, 23:41 | |||
А вот массивное рисование - очень может быть что и нет, в зависимости от объема геометрии и мощности карты. Не стоит терять время на выяснение "а когда же это случится", лучше пресечь сразу.
1
|
|||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
|
|||||
| 28.05.2024, 09:20 | |||||
|
1
|
|||||
| 28.05.2024, 13:27 | ||
|
1
|
||
|
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
|
||
| 28.05.2024, 22:11 | ||
|
8Observer8, glReadPixels читает из текущего glReadBuffer, который по умолчанию
1
|
||
| 29.05.2024, 14:04 | |||
Добавлено через 25 минут ---- Да, и хочу предложить маленькую "викторину" Какие ID надо сохранять в пикcеле?1) ID объекта/модели 2) ID примитива (напр тр-ка) 3) ID ??? Не путать с др данными, напр глубина Z, барицентрик и.т.д., именно номер/ID
0
|
|||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
|
||
| 29.05.2024, 15:16 | ||
|
0
|
||
| 29.05.2024, 15:16 | |
|
OpenGL поворот объектов файлы 3д объектов существуют в OpenGL? Как в OpenGL обнаруживать столкновения объектов Создание теней для объектов в OpenGL Как сделать движение нескольких объектов. OpenGL Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|