https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/ 을 참고해서 만든 ray-triangle intersection 에 관한 소개입니다.
(레이 트레이싱 전체를 다루는 게 아닌데 슬라이드를 잘못 만들었습니다...)
https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/ 을 참고해서 만든 ray-triangle intersection 에 관한 소개입니다.
(레이 트레이싱 전체를 다루는 게 아닌데 슬라이드를 잘못 만들었습니다...)
5. 1) 객체 전체의 최대, 최소의 x, y, z 값을 찾는다. (왜? : 객체의 최대 충돌 면적을 알기 위해) 2) 해당 값으로 객체를 덮는 직(정)육면체 배정 (왜? : 중점을 구해서 Bounding Sphere 중심으로 사용함) 3) 공간내 대각선이 만나는 한점인 중점을 구한다. (왜? : 마주보는 평면이 서로 평행관계 이므로) 경계구 충돌 검출
6. 4) 중점과 가장 먼 정점과의 거리를 구한다. (왜? : 가장 먼 정점과의 거리가 경계구의 반지름) 왜 Bounding Sphere 인가? - 반지름 만으로 경계구 간의 빠른 충돌 여부 확인 - 하위 객체들의 개별적인 경계구를사용할수 있다. 경계구 충돌 검출
8. 경계구 보다 좀더 정밀한 충돌 검출 (왜 삼각형인가? : 최소한의 점으로 이루어진 면) 평면의 방정식 : Ax+By+Cz+d = 0 (왜? : 평면에 있는 점은 같은 법선 벡터를 갖는다.) 법선 벡터를 구하는 방법 : 평면위 두 벡터의 외적 (왜? : 두 벡터의 외적 벡터는 해당 벡터와 수직) 여기서 주의! : 외적을 계산할땐좌표계를 주의! 삼각형 대 삼각형 충돌 검출
9. 1) 삼각형 표면의 법선 벡터를 구한다. (왜? : 평면을 이용해서 교차 판정하기 위해) (왜 평면을 구하는가? : 삼각형은 평면에 포함관계 이므로 평면에 충돌했다면 충돌한 선분이 삼각형에 포함되는지 확인한다.) 2) 법선 벡터들의 성분을 평면 방정식에 대입 (왜? : 평면을 구하기 위해) (왜 d의 값이 –DotProduct(cross_v1v2, p) 인가? : 법선벡터n(a,b,c) , 평면위 점P(x, y, z), P’(x’, y’, z’) a(x – x’) + b(y – y’) + c(z – z’) = 0 0 = ax + by + cz – (ax’ + by’ + cz’) = ax + by + cz + d 삼각형 대 삼각형 충돌 검출
10. 3) 평면이 삼각형에 충돌했는지 판단 (왜? 충돌된 선분의 점 성분 중에 하나라도 평면상의 삼각형에 포함되면 충돌 된 것임.) 매개변수 방정식을 구해서 교점의 좌표를 구하자. (왜 : 방정식 t값이 [0,1]이 아닌경우 만나지 않음.) 선분-평면 교차
11. 한쪽 좌표로 투영화 (왜 : 교점도 평면화 시키면 충돌 여부 판별 가능) 좌표축과 평행관계일때 평면화 시키면?… (평면의 법선 벡터 성분 중 최대값 쪽으로 정한다.) (왜 : 투영화된 삼각형의 성분이 평면 위 선분에 포함된다.) 삼각형 평면화
12. 평면화 된 교점이 평면화된 삼각형 안에 있는지 판별 직선의 방정식 (y = mx + b)을 이용해서 중점의 x좌표를 직선 방정식에 넣었을때 나온 y값이 중점의 y좌표보다 작으면 중점은 선의 위쪽, 크면 중점은 선의 아래쪽 점이 삼각형 안에 있는지의 점검
13. 위 방식으로 교차하는 변이 하나만 있어도 두 삼각형은 충돌한 것임. 확실하게 하고 싶으면 서로 반대 경우로 계산. 두 삼각형 모두에 대해서 선들을 판정