평면 ( 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의 주석처리된 부분을 풀어주면 유한 평면에서만 충돌하는지 검사 가능



C++에서 게임을 만들다 보면

버튼을 눌렀을때 특정 행동을 수행해야 할때가 많다.

이때 싱글톤이나 이런거로 다 처리할수는 없기 때문에

Delegate (델리게이트)를 이용해서 처리하는게 좋다.

원래 이개념은 C++의 콜백함수에서 발전된 C#에서 만들어진 내용이다.

UIButton 클래스 위에 iButtonDelegate라는 클래스를 생성했다.

다음은 포인터로 생성했다.

(SYNTHESIZE는 매크로 함수로 사용하고 있는데 여기서는 iButtonDelegate* m_pDelegate를 만든거라고 이해하면 된다.

버튼을 생성할때 이렇게 자기자신의 주소를 넣어준다.

다음 해당 클래스 (cMainGame)에서 OnClick에 대해 이렇게 구현되어 있기 때문에 클릭하게 되면 OK로 바뀌면서 확인이라는 글씨가 출력된다.


요약 

1. OnClick이라는 가상함수를 가진 클래스를 만든다. 파라미터(인자)로 주소를 받게한다.

2. OnClick이라는 함수를 실행했을때 원하는 동작을 해당 클래스에 구현한다.

3. SetDelegate를 통해 자신의 주소를 넘겨주면 된다.

+ Recent posts