Алгоритм Моллера — Трумбора (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;
}

Примечания

[править | править код]
  1. Fast, Minimum Storage Ray/Triangle Intersection Архивная копия от 17 мая 2017 на Wayback Machine, Möller & Trumbore. Journal of Graphics Tools, 1997.
  2. Möller-Trumbore algorithm. scratchapixel. Дата обращения: 25 октября 2015. Архивировано 7 ноября 2015 года.