본문 바로가기

Library/Computer Graphics

직선과 삼각형의 교차점 검사

공간에서 직선과 삼각형의 교차 여부를 조사하는 알고리즘을 이해하기 위해서는 먼저 무게 중심(barycentric coordicate)을 이해해야 한다. 즉, 삼각형이 3개의 버텍스 로 구성되어 있을 때, 내부의 점 으로 표현할 수 있으며, 의 좌표에 미치는 의 가중치를 나타낸다. 을 만족해야 한다. 따라서, 다음과 같이 정리할 수 있다.







여기서 로 바꿔 쓸 수 있으며, 광선 와 삼각형의 교차점을 구하는 것은 방정식 의 해를 구하는 것과 같다. 즉, 다음의 방정식으로 표현할 수 있다.






여기서 로 정의하면, 는 크라머(Cramer)의 공식에 의해 구할 수 있다.





위의 식은 다음과 같이 다시 정리할 수 있다.







최종적으로, 이것을 의사코드로 표현하면 다음과 같다.


// o is ray's original, d is direction, v1, v2, v3 is triangle coordinate
RayTriangle_Intersect(o, d, v1, v2, v3)
    Vertex e1 = v2 - v1
    Vertex e2 = v3 - v1
    Vertex p = d cross e2
    Scalar a = e1 dot p
    if(a > -epsilon and a < epsilon)
        return NO_INTERSECTION<br/>

    Scalar f = 1 / a
    Vertex s = o - v1
    Scalar u = f * (s dot p)
    if(u < 0 or u > 1)
        return NO_INTERSECTION

    Vertex q = s cross e1
    Scalar v = f * (d dot q)
    if(v < 0 or u + v > 1)
        return NO_INTERSECTION

    Scalar t = f * (e2 dot q)
    return INTERSECTION // u, v, t is solved


여기서 스칼라(scalar) 타입의 변수는 부동소수점 타입이며, Vertex는 x, y, z 3개의 공간좌표를 가진다. 여기서 입실론(epsilon)이 의아할텐데, 사실 컴퓨터에서 부동소수점 연산은 정확하지 않다. 즉, 방정식에서 정수로 표현되지 않는 유리수 사이에서의 연산 결과가 0이라고 하더라도, 컴퓨터에서는 0이 아닐 수 있다. 입실론은 이 오차 범위를 나타내는데, 이 입실론 값은 인 경우 만족할만한 정확도를 보인다고 알려져 있다.