목차

언리얼엔진3 에서의 충돌

개요

언리얼엔진3 에는 두가지 방식의 충돌처리가 있다. Unreal collision 과 RigidBody 를 위한 Physics collision1) 가 그것이다.

Unreal collision

Unreal collision 을 위한 property 들은 다음과 같다.

Actor 와 PrimitiveComponent 사이에 비슷한 성질의 플래그가 있다. 이럴 경우 Actor 의 것이 기준이 되며, PrimitiveComponent 는 Actor 와 같은 값을 가져야만 효력을 가진다.

Physics collision

작성 중

Encroacher

미리 알고 넘어가야 할 용어가 있다. Encroacher 가 그것인데 encroachment 를 수행하는 주체로써 다른 액터의 영역에 침범해 들어갈 수 있는 녀석을 말한다. Encroacher 는 Actor 의 Physics 가 PHYS_RigidBody 나 PHYS_Interpolating 이거나 bCollideAsEncroacher 를 TRUE 일 경우 해당된다.

UnActor.h
inline UBOOL AActor::IsEncroacher() const
{
    return
        bCollideActors &&
        (
            Physics == PHYS_RigidBody ||
            Physics == PHYS_Interpolating ||
            bCollideAsEncroacher
        );
}

코드 흐름 및 관련 함수 소개

위에서 설명한 내용이 매 프레임 어떤 식으로 계산되어 지는지를 코드흐름을 통해 살펴보자.

먼저 Actor 를 움직이는 함수인 UWorld::MoveActor 로 시작된다.

보면 알겠지만 결국에는 PointCheck 를 수행하는 것으로 귀결된다. 결국 핵심은 양자 중 더 작은 놈이 Point 가 되고 (이 경우가 더 정밀하기 때문) 다른 놈이 Point 를 포함하는지를 확인하는 것이다.

MoveActor 로 시작되는 Encroachment 체크는 정밀하지 못하며 CCD (Continuous Collision Detection) 를 수행하지 못한다.

관련 Console 명령어

참조

1) 이 충돌처리는 Novodex PhysX 에 기반한다.
2) Skeletal-based 액터는 USkeletalMeshComponent::UpdateTransform 에서 다뤄진다.
3) 여기서 유효한 조건은 동적 타입이 UPrimitiveComponent 이고 AlwaysCheckCollision & CollideActors 가 TRUE 인 경우이다.