728x90
728x90
게임 개발을 하다 보면 두 벡터 사이의 각도를 구해야 하는 경우가 종종 있습니다.
예를 들어, 적 AI가 플레이어를 시야 내에 두고 있는지 확인하거나,
물체의 반사 각도를 계산하거나, 조준 시스템을 구현할 때 이러한 계산이 필요합니다.
언리얼 엔진 5(UE5)에서 두 벡터 사이의 각도를 구하는 방법을 자세히 알아보고, 특히 내적의 결과값이 가지는 의미에 대해 심도있게 다뤄보겠습니다.
1. 내적 (Dot Product) 그리고 그 의미
두 벡터의 내적은 단순히 계산 이상의 중요한 의미를 지닙니다. 두 벡터가 얼마나 같은 방향을 향하고 있는지를 수치적으로 나타내는 척도이며, 다음과 같은 의미를 내포합니다.
- 유사성 측정: 내적의 절대값이 클수록 두 벡터는 비슷한 방향을 가리킵니다. 즉, 유사성이 높다고 할 수 있습니다. 두 벡터가 완전히 같은 방향을 가리킬 때 내적은 최대값을 가집니다.
- 직교성 확인: 내적의 값이 0이면 두 벡터는 서로 직교(수직)합니다. 이는 두 벡터가 어떠한 공통된 방향 성분도 가지고 있지 않다는 것을 의미합니다.
- 방향성 판단:
- 내적의 결과가 양수: 두 벡터는 대체로 같은 방향을 향하고 있습니다.
- 내적의 결과가 0: 두 벡터는 서로 수직입니다.
- 내적의 결과가 음수: 두 벡터는 반대 방향을 향하고 있습니다.
이러한 특성 때문에 내적은 게임 개발뿐만 아니라 물리학, 컴퓨터 그래픽스 등 다양한 분야에서 활용됩니다. UE5에서는 FVector::DotProduct() 함수를 사용하여 내적을 구할 수 있습니다.
2. 공식
두 벡터 A와 B 사이의 각도(θ)를 내적을 사용하여 계산하는 공식은 다음과 같습니다.
cos(θ) = (A • B) / (|A| * |B|)
여기서,
- A • B는 A와 B의 내적입니다.
- |A|와 |B|는 벡터 A와 B의 크기(길이)입니다.
3. UE5에서의 단계
C++와 블루프린트에서 두 벡터 사이의 각도를 계산하는 방법을 알아보겠습니다.
FVector Vector1 = FVector(1.0f, 0.0f, 0.0f);
FVector Vector2 = FVector(0.0f, 1.0f, 0.0f);
// 벡터를 정규화하여 방향만 고려합니다.
Vector1.Normalize();
Vector2.Normalize();
// 내적을 계산합니다.
float DotProduct = FVector::DotProduct(Vector1, Vector2);
// 아크코사인(arccosine)을 사용하여 라디안 단위의 각도를 계산합니다.
float AngleInRadians = FMath::Acos(DotProduct);
// 각도를 도 단위로 변환합니다.
float AngleInDegrees = FMath::RadiansToDegrees(AngleInRadians);
// AngleInDegrees에는 두 벡터 사이의 각도가 저장됩니다.
// 내적 값에 따른 방향성 판단 예시
if (DotProduct > 0) {
UE_LOG(LogTemp, Warning, TEXT("두 벡터는 같은 방향을 향합니다."));
} else if (DotProduct == 0) {
UE_LOG(LogTemp, Warning, TEXT("두 벡터는 수직입니다."));
} else {
UE_LOG(LogTemp, Warning, TEXT("두 벡터는 반대 방향을 향합니다."));
}
블루프린트
- 비교할 두 벡터를 가져옵니다.
- "Vector Length" 노드를 사용하여 각 벡터의 크기를 구합니다.
- "Dot Product" 노드를 사용하여 두 벡터의 내적을 계산합니다.
- "Divide" 노드를 사용하여 내적을 크기의 곱으로 나눕니다.
- "ACOS" 노드를 사용하여 결과의 아크코사인을 계산합니다 (라디안 단위의 각도).
- "Radians to Degrees" 노드를 사용하여 각도를 라디안에서 도로 변환합니다.
블루프린트에서도 내적 값을 활용하여 분기 처리를 할 수 있습니다. "Branch" 노드와 비교 연산자를 사용하여 내적 값에 따라 다른 로직을 실행할 수 있습니다.
중요한 고려 사항
- 정규화 (Normalization): 내적을 계산하기 전에 벡터를 정규화하는 것이 중요합니다. 이렇게 하면 벡터의 크기가 아닌 방향만 고려하게 됩니다.
- 각도 범위: Acos() 함수는 0도에서 180도 (0에서 π 라디안) 사이의 각도를 반환합니다. 부호 있는 각도 또는 다른 범위의 각도를 구해야 하는 경우 추가 계산이나 FMath::Atan2()와 같은 함수를 사용해야 할 수 있습니다.
- 성능: 이 계산을 자주 수행하는 경우 (예: 매 프레임마다), 불필요한 계산을 피하기 위해 코드를 최적화하는 것이 좋습니다.
활용 예시
- AI: 적이 플레이어의 시야 내에 있는지 확인 (내적 값을 사용하여 시야각 내에 있는지 판단).
- 물리학: 튕기는 물체의 반사 각도 계산.
- 게임플레이: 조준 시스템 생성 또는 물체 간의 상대적 방향 결정.
- 벡터 기반 AI 움직임: 원하는 방향으로의 벡터와 현재 이동 방향 벡터의 내적을 이용하여 얼마나 방향을 틀어야 하는지 계산.
내적과 아크코사인 함수를 함께 사용하는 방법을 이해하면 UE5에서 벡터 사이의 각도를 효과적으로 계산하고, 특히 내적의 의미를 활용하여 더욱 다양한 게임 로직을 구현할 수 있습니다. 위 내용을 참고하여 게임 개발에 유용하게 활용하시길 바랍니다.
728x90
반응형