우리가 충돌 알고리즘을 사용할 때 가장 간단 한  버전의 충돌 알고리즘이다 AABB 알고리즘이란 특정 좌표계에서 사각형혹은 직육면체 형태의 범위에 대한 충돌을 검증 할 때 사용한다

이렇게 4각형이 2개 겹쳐 있을 때 수식을 이용해서 충돌 여부를 구하는 방식이다 이방식은 3차원에서도 비슷하게 사용이 가능하다. 근데 유니티에서 제공하는 함수를 사용 하면 offset 즉 범위 확장이 불가능 했었다. 이에 해당 기능을 직접 구현했어야 했다.

구현하면서 시행착오 겪었던 내용은 Bound의 Min값과 Max값을 계속 가져왔는데 이 좌표계가 매우 이상했다 분명 다른  위치에 있는데 같은좌표를 반화하는것을 보고 Bound의 Min값과 Max값이 local position임을 깨달았다. 이에 해당 사항들을 world position으로 변경 해줘야 한다
이에 TrasnformPorint 함수를 사용해준다

    public void UpdateCoordinate()
    {
        if (meshFilter == null)
        {
            return;
        }
        MeshCollider meshCollider = GetComponent<MeshCollider>();
        Mesh mesh = meshCollider.sharedMesh;
        Bounds meshBounds = mesh.bounds;

        minCdepusOffset = transform.TransformPoint(meshBounds.min);
        maxCdepusOffset = transform.TransformPoint(meshBounds.max);
        Debug.Log(maxCdepusOffset);
        Debug.Log(minCdepusOffset);
    }
    public  void ResizeCoordinate(int offsetx, int offsety, int offsetz)
    {
        maxCdepusOffset.x += offsetx/2;
        maxCdepusOffset.y += offsety/2;
        maxCdepusOffset.z += offsetz/2;
        minCdepusOffset.x -= offsetx / 2;
        minCdepusOffset.y -= offsety / 2;
        minCdepusOffset.z -= offsetz / 2;
        Debug.Log(maxCdepusOffset);
        Debug.Log(minCdepusOffset);
    }

이렇게 2가지 함수를 작성하였다 첫번째 함수는 내가 offset을 부여하기 전에 나의 Min과 Max를 업데이트 한다.
그후 2번째 함수는 Max와 Min에 Offset을 추가해준다
그후 해당 좌표를  비교해준다 

    public bool CheckInterSect(Vector3 min1, Vector3 max1, Vector3 min2, Vector3 max2)
    {
        return (min1.x <= max2.x && max1.x >= min2.x) &&
       (min1.y <= max2.y && max1.y >= min2.y) &&
       (min1.z <= max2.z && max1.z >= min2.z);
    }

이 공식을 이용하여 세좌표로 만들어지는 영역이 겹치는 지 아닌지 확인한다

+ Recent posts