Вы ищете непроектированную функцию, которая преобразует экранные координаты в луч, отлитый из положения камеры в трехмерный мир. Затем необходимо выполнить тесты пересечения луча / треугольника, чтобы найти ближайший треугольник к камере, который также пересекает луч.
У меня есть пример отмены проецирования, доступный по адресу jax / camera.js # L568 - но вам все равно потребуется реализовать пересечение лучей / треугольников. У меня есть реализация этого в jax / triangle.js # L113 .
Однако существует более простая и (обычно) более быстрая альтернатива, называемая «подбором». Используйте это, если вы хотите выделить весь объект (например, шахматную фигуру), и если вам все равно, где на самом деле щелкнула мышь. Способ WebGL сделать это состоит в том, чтобы визуализировать всю сцену в различных оттенках синего (синий является ключом, а красный и зеленый используются для уникальных идентификаторов объектов в сцене) в текстуру, а затем считывать пиксель из эта текстура. Декодирование RGB в ID объекта даст вам объект, по которому щелкнули. Опять же, я реализовал это и он доступен по адресу jax / world.js # L82 . (См. Также строки 146, 162, 175.)
Оба подхода имеют свои плюсы и минусы (обсуждается здесь и в некоторых комментариях после), и вам необходимо выяснить, какой подход лучше всего соответствует вашим потребностям. Сборка происходит медленнее с огромными сценами, но непроектирование в чистом JS является чрезвычайно медленным (поскольку сам JS не так уж быстр), поэтому моя лучшая рекомендация - поэкспериментировать с обоими.
К вашему сведению, вы также можете взглянуть на проект GLU и код непроектирования, на котором я свободно основывал свой код: http://www.opengl.org/wiki/GluProject_and_gluUnProject_code