평면 ( 3개의 점 )과 직선 (원점과 방향)의 교차점을 구하는 방법이다.

수학적 개념보다 코드가 더 이해가 빠른거 같다.


Unity 상에서 C#코드를 통해 계산했습니다. (Intersect Triangle)


무한 평면 기준

    private bool IntersectTriangle(Vector3 RayOrigin, Vector3 RayDirection, Vector3 V0, Vector3 V1, Vector3 V2)
{
Vector3 edge1 = V1 - V0;
Vector3 edge2 = V2 - V0;

Vector3 pvec = Vector3.Cross(RayDirection, edge2);

dot = Vector3.Dot(edge1, pvec);

Vector3 tvec;
if (dot > 0) tvec = RayOrigin - V0;
else
{
tvec = V0 - RayOrigin;
dot = -dot;
}

if (dot < 0.0001f)
return false;

u = Vector3.Dot(tvec, pvec);
// if (u < 0.0f || u > dot)
// return false;

Vector3 qvec = Vector3.Cross(tvec, edge1);

v = Vector3.Dot(RayDirection, qvec);
// if (v < 0.0f || u + v > dot) return false;

t = Vector3.Dot(edge2, qvec);
float flnvDet = 1.0f / dot;

t *= flnvDet;
u *= flnvDet;
v *= flnvDet;

return true;
}

코드 자체의 원리는

1. 3개의 점을 통해서 2개의 직선을 구한다.

2. 2개의 직선을 외적해서 법선 벡터를 구한다.

3. 내적을 통해 직선의 방향을 결정한다.


3 - 1 유한 평면의 경우 내적을 통해 u를 계산, 평면의 좌, 우를 넘어갔는지 판단한다.

3 - 2 유한 평면의 경우 내적을 통해 v를 계산, 평면의 위, 아래를 넘어갔는지 판단한다.


if (IntersectTriangle(Line.position, Line.forward, P0.position, P1.position, P2.position))
{
Vector3 point = Line.position + (Line.forward * t);
Gizmos.DrawSphere(point, 0.1f);
}

true 일때만 교차점이 생기고 , 교차점은 직선의 원점 + 직선의 방향 * t로 구하면 된다.


유한 평면 기준

IntersectTriangle의 주석처리된 부분을 풀어주면 유한 평면에서만 충돌하는지 검사 가능



+ Recent posts