RVO

RVO(Reciprocal Velocity Obstacles)란 움직이는 객체들이 서로의 속도와 방향을 고려하여 충돌을 피하는 방법입니다.

예를 들어, 사람들이 붐비는 거리에서 우리는 주변 사람들의 움직임을 보며 자신의 속도와 방향을 조절합니다.
길을 막고 있으면 천천히 걷거나, 자신을 향해 오면 피해주거나 등등의 방식으로 언리얼 엔진 내에 적용한 것이 RVO입니다.
즉, RVO는 동적 액터들이 서로를 장애물로 인식하고 충돌을 피하는 알고리즘입니다.

RVO 적용

RVO를 C++로 다음과 같이 적용할 수 있습니다.

// 헤더
// 이동할 타겟 액터 AIController->MoveToActor함수를 사용
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AI Movement")
AActor* TargetActor;

// RVO 회피 거리 설정
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "RVO")
float AvoidanceRadius = 300.0f;

// RVO 계급(우선순위) 설정
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "RVO")
float AvoidanceWeight = 0.5f;

// 소스
// RVO 회피 시스템 활성화
UCharacterMovementComponent* MovementComponent = GetCharacterMovement();
if (MovementComponent)
{
    // RVO 회피 시스템의 활성화 여부를 결정하는 가장 기본적인 설정입니다.
	MovementComponent->bUseRVOAvoidance = true;
    // AI가 다른 오브젝트를 감지하고 회피를 시작하는 거리를 결정합니다.
	MovementComponent->AvoidanceConsiderationRadius = AvoidanceRadius;
    // 해당 클래스를 상속받은 캐릭터의 회피 우선순위를 결정합니다.
	MovementComponent->AvoidanceWeight = AvoidanceWeight;
}

// MoveToActor를 사용해서 타겟 액터를 향해 이동
AIController->MoveToActor(
	TargetActor,    // 목표 액터
	50.0f,          // 도착 판정 반경
	true,           // 충돌 영역이 겹치면 도착으로 간주
	true,           // 경로 탐색 사용
	false           // 목적지를 네비게이션 메시에 투영(Projection)하지 않음
);

서로를 피해가는 것을 알 수 있게 지나갈 수 있는 좁은 길목을 만들어서 확인해보았습니다.
또한, 테스트의 편의성을 위해 Draw Debug Arrow함수를 사용해서 이동하려는 위치까지의 선이 그려지도록 했습니다.

만약 RVO를 사용하지 않은 상태에서 AI가 지나가도록 구현한다면 다음과 같이 서로 길에 막혀 꽉 끼게되는 것을 볼 수 있습니다.

RVO-False

이제 RVO를 적용한 상태에서 AI끼리 지나가게 된다면 다음과 같이 서로 길을 지나가기 전에 제자리에 맴도는 AI도 있고, 밀려 움직이는 AI도 있습니다.
결과적으로는 서로를 인식하고, 충돌을 일으키지 않아 잘 이동할 수 있는 것을 볼 수 있습니다.

RVO-True

Date:     Updated:

카테고리:

태그: ,

UE5Dev 카테고리 내 다른 글 보러가기

댓글남기기