프로그래밍 공부
작성일
2023. 11. 7. 23:37
작성자
WDmil
728x90

구체와 사각형의 충돌을 구현해보자.

 

전에 만들었던 Sphere 객체와 Box객체를 사용한다.

 

Box객체에 SphereCollider를 받아와서 사용할 수 있다.

bool BoxCollider::IsSphereCollision(SphereCollider* collider)
{
    ObbDesc box;
    GetObb(box); // OBB 정보를 얻어와서 box에 저장합니다.

    Vector3 closestPointToSphere = box.pos; // OBB의 중심을 기준으로 가장 가까운 지점을 초기화합니다.

    FOR(3) // OBB의 3개의 로컬 축에 대한 루프를 시작합니다.
    {
        Vector3 direction = collider->GetGlobalPosition() - box.pos; // OBB 중심에서 충돌체의 중심까지의 방향을 계산합니다.

        float length = Vector3::Dot(box.axis[i], direction); // 충돌체 중심과 OBB 축 사이의 내적을 계산하여 OBB 축 방향으로의 거리(length)를 얻습니다.

        float mult = (length < 0.0f) ? -1.0f : 1.0f; // 거리의 방향을 결정합니다. OBB 축 방향과 반대 방향인 경우 -1, 같은 방향인 경우 1을 사용합니다.

        length = min(abs(length), box.halfSize[i]); // OBB 축 방향으로의 거리(length)를 OBB의 halfSize와 비교하여 더 작은 값을 선택합니다.

        closestPointToSphere += box.axis[i] * length * mult; // 가장 가까운 지점을 업데이트합니다. 이 지점은 OBB의 표면 위의 지점입니다.
    }

    float distance = (collider->GetGlobalPosition() - closestPointToSphere).Length(); // 충돌체의 중심과 OBB 표면의 가장 가까운 지점 사이의 거리를 계산합니다.

    return distance <= collider->Radius(); // 계산된 거리가 충돌체의 반지름보다 작거나 같으면 충돌이 발생한 것으로 간주합니다.
}

충돌체 중심과 객체의 육면체 객체의 중심축 사이의 내적을 계산하여. OBB축 방향으로의 거리내적을 얻는다.

 

length가 나왔다면,  해당 값이 OBB축방향의로의 거리가. x축 또는 y축 아니면 z축 의 기본 사이즈와 차이가 발생하는지 검사한다.

 

더 작은값을 가져오는 이유는, 현재 계산되는 축의 방향이 obbDesc의 외곽크기를 넘어가면 안되기 때문,

그후, OBB표면 위의 지점을 3방향 전부 계산하여 대입해준다.

 

그렇게 나온 표면데이터에서. 충돌체의 중심까지 측정한다음.

 

해당값이. 충돌체의 반지름보다 작거나 같다면. 충돌이 발생하였다고 간주한다.

 

구체 자체에서 Box를 충돌검사 할때는 다음과 같이 작성한다.

bool SphereCollider::IsBoxCollision(BoxCollider* collider)
{
	return collider->IsSphereCollision(this);
}

 

728x90