|
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 18
|
|
Поиск местонахождения объектов в opengl. Qt07.11.2014, 18:55. Показов 7783. Ответов 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
|
||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,067
|
|||
| 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
|
|||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,067
|
|||||
| 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
|
|||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,067
|
||
| 29.05.2024, 15:16 | ||
|
0
|
||
| 29.05.2024, 15:16 | |
|
OpenGL поворот объектов файлы 3д объектов существуют в OpenGL? Как в OpenGL обнаруживать столкновения объектов Создание теней для объектов в OpenGL Как сделать движение нескольких объектов. OpenGL Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|