ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RT] Ray 와 Triangle 의 충돌 판정
    과제/miniRT 2021. 1. 14. 18:58

    개떡같이 못그린 그림...

     

    3차원 공간상의 세  P1, P2, P3 를 가진 삼각형이 존재한다고 하자.

    이 삼각형을 편의상 Tri 라고 하고

     

    Ray  =  O + td 이고, 해당 점을 P라고 한다면, P와 Tri 같의 충돌판정은 다음 2과정으로 이루어진다.

    1. Tri 가 존재하는 평면과 P가 충돌하는가? -> plane 과 Ray의 충돌판정을 활용.

    2. P가 Tri 가 있는 평면과 같은 평면에 존재한다면, 해당 P는 Tri 의 세 꼭지점 내부에 있는가?

     

    2번은 판정할 때 외적과 내적을 사용한다.

    결론부터 말하자면

    ((P3 - P1) X (P - P1)) · ((P2 - P1) X (P - P1)) >= 0 이면 P3 - P1 을 기준으로한 벡터에 대해서 

    점 P 과 점 P2 가 같은 방향에 있다는 의미이다.

    따라서 P2 - P3 를 기준으로 한 위 계산과, P1 - P2 를 기준으로 한 위의 계산 모두

    0이상이면 P는 삼각형 내부에 있다는 의미가 된다.

     

     

    int tri_p_int_tri(t_data_tri *data, t_vec p)
    {
         t_vec base;
         t_vec to_p;
         t_vec to_o;

         base = vec_minus(data->p2, data->p1);
         to_o = vec_minus(data->p3, data->p1);
         to_p = vec_minus(p, data->p1);
         if (vec_dot(vec_cross(base, to_o), vec_cross(base, to_p)) <= 0)
               return (0);
         base = vec_minus(data->p3, data->p2);
         to_o = vec_minus(data->p1, data->p2);
         to_p = vec_minus(p, data->p2);
         if (vec_dot(vec_cross(base, to_o), vec_cross(base, to_p)) <= 0)
              return (0);
         base = vec_minus(data->p1, data->p3);
         to_o = vec_minus(data->p2, data->p3);
         to_p = vec_minus(p, data->p3);
         if (vec_dot(vec_cross(base, to_o), vec_cross(base, to_p)) <= 0)
              return (0);
         return (1);
    }

    '과제 > miniRT' 카테고리의 다른 글

    [RT] Ray 와 Cylinder 의 충돌판정  (0) 2021.01.13
    [RT] Ray 와 Plane 의 충돌 판정  (0) 2021.01.11
Designed by Tistory.