1. Box Collider

박스 콜라이더는 위와 같이 x좌표, y좌표가 박스 내부에 있는지 판별을 하게 됩니다.

x좌표와 y좌표 모두 내부에 속해있으면 충돌로 판정하게 됩니다.

(만약 3차원이라면 z좌표까지도 내부인지 확인해주면 되겠습니다.)

public bool IsBoxInner ()
{
    float x = clickPosition.x;
    float y = clickPosition.y;

    return xMin <= x && x <= xMax &&
            yMin <= y && y <= yMax;
}

 

2. Circle Collider

원형 콜라이더는 거리를 구해서 반지름 값보다 같거나 작은지를 확인하면 됩니다.

간단한 계산 덕분에 가장 빠른 충돌체 처리로 알려져 있습니다.

피타고라스 정리를 이용하여 거리를 계산합니다.

가로^2 + 세로^2 = 빗변^2

위와 같이 빗변을 구하고 루트를 씌워주면 원하는 빗변값을 구할 수 있고,

빗변이 원의 반지름 이내라면 원과 접촉했다고 판별할 수 있습니다.

최적화는 빗변에 루트를 씌우지 않고 반지름을 제곱해주어 판별하면 되겠습니다.

//방법1
public bool IsCircleInner ()
{
    float distance = 
    Mathf.Sqrt((clickPosition.x - colliderPosition.x) * (clickPosition.x - colliderPosition.x)
             + (clickPosition.y - colliderPosition.y) * (clickPosition.y - colliderPosition.y));
    
    //float distance = Vector2.Distance(colliderPosition, clickPosition);

    return distance <= circleRadius;
}

//방법2
public bool IsCircleInner ()
{
    float distance = 
               (clickPosition.x - colliderPosition.x) * (clickPosition.x - colliderPosition.x)
             + (clickPosition.y - colliderPosition.y) * (clickPosition.y - colliderPosition.y);
    
    return distance <= circleRadius * circleRadius;
}

 

3. Triangle Collider

예전에 프로그래밍 고수형이 넥슨 회사 면접 볼 때 나왔던 문제라고 저한테 풀어보라고 했었습니다.

점이 삼각형 내부(충돌)인지 아닌지 아닌지 어떻게 판별을 해야될까요?

처음엔 삼각형의 기울기를 생각했었는데 선형대수학에 나오는 벡터의 외적을 이용하면 쉽게 풀 수 있습니다.

2차원 좌표이기에 외적을 구해보면 z값에 대해서만 변화가 있게 됩니다.

이 z값이 양수인지 음수인지를 따져보면 현재 위치에서 방향을 알 수 있게 됩니다.

먼저 상대적인 좌표로 만들어줍니다. 기준점 (-2, -2)으로부터의 거리로 만들어주고

두 점의 외적을 구해봅니다. 노란 화살표가 기준이 되고, 보라색 화살표가 왼쪽인지 오른쪽인지 판별을 합니다.

이렇게 3개의 꼭지점을 기준으로 위치를 판별해줍니다.

결과는 왼쪽, 오른쪽, 왼쪽 이 나왔고 점은 밖에 있다는 것이 판별되었습니다.

삼각형 내부에 있는 경우는 모두 동일한 방향에 있는 경우입니다.

아래는 이미 포지션 값을 정해놓고, 시뮬레이션 단계마다 판별을 하는 코드입니다.

전체 코드는 깃허브에 유니티 프로젝트와 함께 올려두었습니다.

private void DeterminePosition ()
{
    Vector3[] positions = triangle_clickPoint.GetTrianglePositions();

    Vector3 startPosition = positions[simulationStep - 1]; //기준 위치
    Vector3 endPosition = positions[simulationStep];       //기준 라인
    Vector3 basePoint = endPosition - startPosition;       //1번 화살표 구하기
        
    endPosition = triangle_clickPoint.GetClickPosition();  //(노란점)클릭 위치
    Vector3 clickPoint = endPosition - startPosition;      //2번 화살표 구하기

    //벡터의 외적을 통해 z값을 구합니다. 아래코드와 동일합니다.
    //float cross = Vector3.Cross(basePoint, clickPoint).z;
    
    float cross = basePoint.x * clickPoint.y - basePoint.y * clickPoint.x;
    
    if (cross >= 0)
    {
        //Is Left
    }
    else
    {
        //Is Right
    }
}

전체 코드와 유니티 프로젝트는 깃허브에 따로 올려두겠습니다!

https://github.com/dlaehdeod/Practice

 

GitHub - dlaehdeod/Practice: Play File and Sources

Play File and Sources. Contribute to dlaehdeod/Practice development by creating an account on GitHub.

github.com

 

+ Recent posts