평면 ( 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의 주석처리된 부분을 풀어주면 유한 평면에서만 충돌하는지 검사 가능
'기타 > 수학적 개념' 카테고리의 다른 글
Direction to Quaternion 방향벡터를 로테이션 (회전) 전환 (0) | 2018.08.03 |
---|---|
Vector2 Angle (각도) 구하기 (Javascript) (0) | 2018.07.27 |
Decimal color to RGB color (0) | 2018.07.26 |
벡터 반사각 구하기 (0) | 2018.07.10 |
3D 게임(DirectX)에서 행렬과 관련된 개념 (0) | 2017.04.12 |