2015-01-23 2 views
0

Мне был приведен пример кода, который мне нужно исправить, и одна функция, которую мне нужно создать, будет использоваться для трассировки треугольного луча. В настоящее время я создал код, подобный этому.Пересечение луча-треугольника в C++

/*RayHitResult is a struct that determines if the ray has reached a polygon*/ 
RayHitResult TriangleIntersect(Ray& ray) 
{ 
    RayHitResult result = Ray::s_defaultHitResult; 
    double t = 10000; /*This is an extreme value for testing*/ 
    Vector3 point; 
    Vector3 edge1 = m_vertices[1] - m_vertices[0]; /*m_vertices[0], [1] and [2] are the vertices of the triangle*/ 
    Vector3 edge2 = m_vertices[2] - m_vertices[0]; 
    Vector3 t_normal = edge1.CrossProduct(edge2); /*This is the normal*/ 
    double d = -(m_vertices[0].DotProduct(t_normal)); /*This is the offset*/ 

    t = -(ray.GetRayStart().DotProduct(t_normal) + d)/(ray.GetRay().DotProduct(t_normal)); /*The variable t is what I need to calculate*/ 

    point = ray.GetRayStart() + ray.GetRay()*t; 

    /*This statement alters the result depending on whether there was an intersection*/ 
    if (t > 0 && t < 10000) 
    { 
     result.t = t; 
     result.normal = this->m_normal; 
     result.point = point; 
     result.data = this; 
     return result; 
    } 

    return result; 
} 

мне нужно вычислить значение переменной «T» для того, чтобы определить, был ли луч пересекается с полигона. Однако текущее уравнение, используемое для вычисления «t», неверно, так как оно не дает заданного результата. Мне сказали, что формула, которую я использую, верна, так может ли кто-нибудь сказать мне, почему текущее уравнение «t» не работает?

enter image description here

п является нормальным, д это смещение, S это луч происхождение и V является сам луч.

ответ

0

Мне всегда легче получить эти уравнения с нуля.

Треугольник можно рассматривать в качестве координат о и 2 векторов и и V.

о + Au + БВ определяет плоскость.

Итак, сначала вы берете луч k + tl и находите значение t, где этот луч пересекает эту плоскость.

Это похоже на то, что делает ваш кусок кода.

(Обратите внимание, что есть очень маленький шанс, что луч летит параллельно плоскости и никакого столкновения не произойдет, вы будете хотеть, чтобы проверить ваш код обрабатывает потенциального Div-на-0 изящно)

Давайте вызовите эту точку столкновения s.

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

Если вы можете выразить s как o + au + bv, то изучение a и b даст вам ответы.

И если a и b ОБА между 0 и 1, то точка находится в параллелограмме с началом o и ребрами a и b.

Кроме того, если a + b < 1 точка находится в пределах ее нижнего ТРЕУГОЛЬНИКА.

+0

Итак, уравнение для t является правильным, и мне просто нужно проверить, находится ли s внутри треугольника? – Ben

+0

Я никогда не говорил, что уравнение для t является правильным. Это выглядит правдоподобно. Но, конечно, вы должны проверить, находится ли s в треугольнике. Но прежде всего, вы должны продвигать себя через это с логикой и пониманием. Не просто взять кусок кода и слепо бросить его в микс. –

 Смежные вопросы

  • Нет связанных вопросов^_^