Как получить мировые координаты при нажатии на окно OpenGL с помощью С++

это ссылка COpenGl Control, который я до сих пор использовал для выполнения своих проектов в MFC.
Я уже написал много функций навигации для этого класса, таких как pan, zoom tool, fixed zoom in, fixed zoom out и т. д. а также мне удалось отобразить на нем изображение.
И во всех этих задачах навигации я использовал события мыши и координаты окна opengl для реализации.
Теперь в одной части проекта (которая касается регистрация изображения в формате tiff с помощью шейп-файлов` Мне нужно использовать мировые координаты:
Например, предположим, что я увеличиваю изображение и нажимаю точку, мне нужно знать, какой пиксель изображения я масштабирую, а не пиксель окна opengl.
Или предположим, что я увеличиваю шейп-файл, отображаемый в opengl, а затем щелкаю точку, мне нужно знать, каковы координаты точки, которую я щелкнул, например (65696,5577,43995,3245) метров .

Как я могу добиться чего-то подобного в opengl?

  • Как я могу получить мировые координаты моей визуализированной формы, когда я нажимаю на окно opengl без координат окна?

person Sepideh Abadpour    schedule 15.09.2013    source источник


Ответы (1)


Я видел много подходов.

  • Если вас просто интересует, КАКОЙ объект вы щелкнули, некоторые сделали проход рендеринга, при котором каждый объект визуализируется уникальным цветом, и щелкается пиксель под мышью. Не могу рекомендовать, так как это может быть ненадежным, и такие вещи, как сглаживание, нарушают его. Производительность не так высока, если это делается в каждом кадре, поскольку драйвер графического процессора должен ждать, пока он не закончит отрисовку, останавливаться, чтобы вернуть вам изображение, а затем продолжать.
  • Если у вас есть матрица преобразования, вы можете преобразовать положение курсора мыши в нормализованные координаты устройства (-1: слева/внизу, 0: в середине экрана, 1: справа/вверху — хотя я, возможно, перепутал верх/низ там) и инвертируйте преобразование с Z, равным -1 и 1, получая начало и конец луча, с которым вы можете выполнить столкновение. Это легко сделать, если вы используете какой-то унифицированный класс сетки или у вас есть способ перебрать все треугольники в сцене.
  • В качестве комбинации двух вышеупомянутых методов получите глубину из буфера глубины и (вам нужно будет линеаризовать ее) используйте ее для интерполяции между ближней и дальней точками на луче.
  • Переберите каждый треугольник в сцене, преобразуя их в нормализованные координаты устройства, а затем в пространство экрана (добавьте единицу, умножьте на ширину/высоту экрана, разделите на два), затем выполните проверку точки в треугольнике относительно треугольников в пространстве экрана. Если вы сохранили координаты в мировом пространстве к тому времени, когда вы нашли треугольник, на который наведен указатель мыши, найдите барицентрические координаты и умножьте на расположение каждой вершины.
person jameswilddev    schedule 15.09.2013