Чтобы следовать уже полученному ответу, квадраты, кубы и треугольники имеют выпуклую форму, поэтому вы можете легко выполнять пересечение луча с объектом, даже непосредственно из геометрии, а не из математического описания совершенного объекта.
Вам понадобится иметь возможность рассчитать расстояние точки от плоскости и пересечение луча с плоскостью. В качестве простого теста вы можете реализовать себя очень быстро, для каждого многоугольника выпуклой формы отработать пересечение между лучом и плоскостью. Затем проверьте, находится ли эта точка за всеми плоскостями, заданными полигонами, которые имеют ребро с той, которую вы только что протестировали. Если это так, то попадание происходит на поверхность объекта - хотя вы должны быть осторожны с копланарными смежными полигонами и ошибками округления.
Как только вы обнаружили столкновение, вы можете легко определить длину луча до точки столкновения. Объект с кратчайшим расстоянием - это тот, который находится впереди.
Если это достаточно быстро, то отлично, иначе вам, вероятно, захочется разбить мир на части или разбить объекты на их силуэты. Выпуклые объекты действительно просты - рассмотрим все ребра, проходящие между одним многоугольником и следующим. Если только один из этих многоугольников находится спереди, то край является частью силуэта. Все края силуэтов вместе можно проецировать в выпуклую 2-мерную форму на плоскости обзора. Затем вы можете проверить касания, выполнив 2d точку-полигон из этого.
Еще одна распространенная альтернатива, которая исключает большую часть математики, - это сбор. Вы визуализируете сцену в невидимый буфер, где каждый объект выглядит как сплошной шарик подходящего уникального цвета. Чтобы проверить на прикосновение, вы просто должны сделать glReadPixels
и проверить цвет.
Для целей glu на iPhone вы можете взять реализацию SGI (как используется MESA). Я использовал его тесселлятор в проекте по отгрузке и производству.