При щелчке мыши отсутствует одна важная информация: глубина нажатия. Все, что у вас есть, это 2D точка на экране. Однако это соответствует лучу в сцене. Лучшее, что вы можете сделать, - это определить луч по щелчку мыши. Для этого вам необходимо отменить проецирование из области просмотра в некоторую точку на этом луче.
Для этого вам необходимо:
инвертировать отображение области просмотра, т.е. отобразить координаты щелчка мыши в области просмотра обратно в диапазон [-1,1] по любой координате (это дает вам NDC), мы молча предполагаем, что глубина будет равна 1.
не проектировать, то есть умножить NDC на глубину 1 путем умножения на матрицу обратной проекции
просмотр не модели, т.е. умножить непроецированную точку путем умножения на матрицу обратного просмотра модели.
Если либо матрица проекции, либо матрица вида единичны, то есть не являются обратимыми, это не будет работать.
Библиотека GLU предлагает это, включая обращение матрицы в функции gluUnproject .
Результат - a точка на луче. Сам луч задается уравнением луча r (\ tau) = r_0 * tau, где r_0 - это та точка, которую вы получили.