-
[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