Вероятно, в первый раз, когда мне нужно было это реализовать, я посмотрел на эти слайды, которые я считаю очень полезными.
http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld016.htm
Сначала убедитесь, что вы понимаете, как это работает, затем вы можете сделать много разных оптимизаций. Например:
if (dot(V, N) >= 0) // no intersection - ray points away from the triangle face
if (dot(P0, N) + d < 0) // no intersection - ray origin is behind the triangle face
Еще одна мысль, которую я использовал, когда я нахожу точку пересечения луча и лица. Я использовал для проверки точки внутри треугольника в 2D, когда я обнулял ось с максимальным абсолютным значением нормали ... если abs (Nx)> abs (Ny)> abs (Nz), я сделаю проверку в Самолет YZ.
Я могу предложить еще одну простую для оптимизации оптимизацию, найти центр и радиус описанной окружности (это зависит от того, часто ли вам нужно это делать, вы можете выбрать более легкий центр, такой как центр масс). Теперь эта точка и радиус определяют ограничивающую сферу вокруг вашего треугольника. Теперь вы можете намного быстрее отбирать лучевые сферы.
http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld012.htm
Не решайте весь многочлен, вам не нужна точка пересечения луча / сферы, просто проверьте наличие корней.
Есть много других оптимизаций, которые вы можете сделать, например: Если ваши вершины и нормали могут быть расположены в более дружественной структуре SSE, вы можете делать 4 проверки за раз. Что примерно может увеличиться примерно в 2,5 раза.