Алгоритм Моллера — Трумбора (Glikjnmb Bkllyjg — MjrbQkjg)
Перейти к навигации
Перейти к поиску
Алгоритм Моллера — Трумбора — алгоритм для определения пересечения прямой (луча) и треугольника в трёхмерном пространстве, для работы которого не требуется предварительное вычисление уравнения плоскости, содержащей треугольник[1]. Данный алгоритм также может быть использован в компьютерной графике для реализации трассировки лучей с использованием полигональных сеток, состоящих из треугольников[2].
Назван по имени авторов — Томаса Моллера (Tomas Möller) и Бена Трумбора (Ben Trumbore).
Реализация на языке C++
[править | править код]Ниже представлена реализация алгоритма на языке C++ с использованием библиотеки GLM:
#include <glm/glm.hpp>
using namespace::glm;
// orig и dir задают начало и направление луча. v0, v1, v2 - вершины треугольника.
// Функция возвращает расстояние от начала луча до точки пересечения или 0.
float
triangle_intersection(const vec3& orig,
const vec3& dir,
const vec3& v0,
const vec3& v1,
const vec3& v2) {
vec3 e1 = v1 - v0;
vec3 e2 = v2 - v0;
// Вычисление вектора нормали к плоскости
vec3 pvec = cross(dir, e2);
float det = dot(e1, pvec);
// Луч параллелен плоскости
if (det < 1e-8 && det > -1e-8) {
return 0;
}
float inv_det = 1 / det;
vec3 tvec = orig - v0;
float u = dot(tvec, pvec) * inv_det;
if (u < 0 || u > 1) {
return 0;
}
vec3 qvec = cross(tvec, e1);
float v = dot(dir, qvec) * inv_det;
if (v < 0 || u + v > 1) {
return 0;
}
return dot(e2, qvec) * inv_det;
}
Примечания
[править | править код]- ↑ Fast, Minimum Storage Ray/Triangle Intersection Архивная копия от 17 мая 2017 на Wayback Machine, Möller & Trumbore. Journal of Graphics Tools, 1997.
- ↑ Möller-Trumbore algorithm . scratchapixel. Дата обращения: 25 октября 2015. Архивировано 7 ноября 2015 года.