Тест пересечения треугольников в OpenGLES, GLSL - PullRequest
0 голосов
/ 07 февраля 2019

Я нашел эту функцию пересечения лучей с треугольниками в репозитории GitHub для моей реализации трассировки лучей.Я знаю, что это алгоритм "Мёллера и Трумбора".я бродил, если кто-то может дать мне подсказку о том, каковы на самом деле аргументы этой функции (я имею в виду математически).код ниже:

bool IntersectTriangle(Ray ray, vec3 p0, vec3 p1, vec3 p2,
                        out float hit, out vec3 barycentricCoord, out vec3 triangleNormal)
{
    const vec3 e0 = p1 - p0;
    const vec3 e1 = p0 - p2;
    triangleNormal = cross( e1, e0 );

    const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );
    const vec3 i  = cross( ray.Direction, e2 );

    barycentricCoord.y = dot( i, e1 );
    barycentricCoord.z = dot( i, e0 );
    barycentricCoord.x = 1.0 - (barycentricCoord.z + barycentricCoord.y);
    hit   = dot( triangleNormal, e2 );

    return  /*(hit < ray.tmax) && */ (hit > INTERSECT_EPSILON) && all(greaterThanEqual(barycentricCoord, vec3(0.0)));
}

Я знаю, что такое barycentricCoords и нормаль треугольника, но я не понимаю математически аргумент "hit" и переменную "e2" внутри функции.

  1. const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );

  2. hit = dot( triangleNormal, e2 );

Насколько я понимаю,переменная попадания позиция попадания луча в треугольник?

ссылка хранилища:

1 Ответ

0 голосов
/ 07 февраля 2019

Я могу ответить на часть вашего вопроса.Я полагаю, что здесь получаются следующие выводы:

out vec3 barycentricCoord

Точка пересечения, P, заданная в барицентрических координатах.

out vec3 triangleNormal

Нормаль треугольника (вектор, перпендикулярный грани треугольника).).

out float hit

Расстояние от точки пересечения до луча.

Эта страница содержит действительно полезную информацию, очень четкую и дает более подробное объяснение:

https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/moller-trumbore-ray-triangle-intersection

Это многое объясняет о вычислениях и том, что представляет математика.Но из того, что я мог видеть, я интерпретирую эти выводы как значение.

Я все еще ломаю эту строку:

const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );

Но эта часть линии,

dot( triangleNormal, ray.Direction )

похоже, что он проверяет, перпендикулярны ли луч и треугольник нормали.Что, если они есть, это означает, что пересечения не произошло, потому что луч параллелен треугольнику.

...