Обычный способ сделать это - вызвать gluUnProject
дважды, с вашими координатами x и y в обоих случаях и znear в одном, а zfar в другом случае.
Это дает вам две точки, через которые проходит луч. Ваш щелчок мыши находится на этом луче.
Теперь сталкивайте объекты (сначала ограничивающие объемы, затем по треугольнику, если хотите, или параметрически, если это возможно) с этим лучом. Ближайший хит - тот, который вам нужен.
Другая возможность будет считывать обратно значение z-буфера (glReadPixels
). Это должно быть сделано с помощью пиксельного буферного объекта и распределено по нескольким кадрам (или это будет очень неприятный трюк в вашем конвейере). Это даст вам трехмерную координату, для которой вы можете найти ближайший объект.
Или вы можете использовать окклюзионные запросы (перерисовка окна просмотра 1x1 с отключенной записью цвета) для того же эффекта.
Наконец, есть, конечно, режим выбора , но это устаревшая функциональность, поэтому вы, вероятно, не захотите его использовать.