물리 시뮬레이션의 핵심인 AddForce와 AddImpulse의 차이점을 자세히 분석하고, 실제 코드 예제까지 더해 완벽하게 정리해 드리겠습니다. 이 두 함수는 물체에 힘을 가하는 역할을 하지만, 작동 방식과 활용 상황이 다르므로 정확한 이해가 필수적입니다.
1. AddForce: 지속적인 힘, 꾸준한 추진력
AddForce는 마치 누군가가 물체를 계속 밀고 있는 것과 같은 효과를 줍니다. 시간이 지남에 따라 지속적인 힘을 가하는 것이죠.
- 특징:
- 지속적인 힘: 시간에 걸쳐 꾸준히 힘을 가합니다.
- 프레임 속도 의존적: 프레임 속도가 낮아지면 힘이 더 오래 적용되어 결과에 영향을 줄 수 있습니다. (프레임이 낮아지면, 힘을 가하는 시간 간격이 늘어나기 때문입니다.)
- 주요 사용 사례:
- 중력: 물체를 아래로 끌어당기는 힘
- 엔진 추력: 로켓이나 자동차를 추진하는 힘
- 마찰력/저항력: 물체의 움직임을 방해하는 힘
- 플레이어가 물체를 밀 때: 지속적인 상호 작용
C++ 예제: 액터에 지속적인 전방 추진력을 가하는 코드
// 헤더 파일 (.h)
UPROPERTY(EditAnywhere)
float ThrustForce = 1000.0f;
// 소스 파일 (.cpp)
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 전방 방향으로 힘을 가합니다.
FVector Force = GetActorForwardVector() * ThrustForce;
MeshComponent->AddForce(Force);
}
이 코드는 매 프레임마다 액터의 전방 방향으로 ThrustForce 값만큼의 힘을 가하여 지속적인 추진력을 제공합니다.
2. AddImpulse: 순간적인 충격, 강력한 한 방
AddImpulse는 마치 야구 방망이로 공을 한 번에 강하게 치는 것과 같은 효과를 냅니다. 순간적으로 큰 힘을 가하는 것이죠.
- 특징:
- 순간적인 힘: 아주 짧은 순간 동안 큰 힘을 가합니다.
- 프레임 속도 독립적: 프레임 속도에 영향을 받지 않고 일정한 결과를 보장합니다. (순간적인 힘이기 때문에, 프레임의 변화가 결과에 미치는 영향이 적습니다.)
- 주요 사용 사례:
- 폭발: 주변 물체에 큰 충격을 주는 상황
- 점프: 캐릭터가 공중으로 도약하는 순간
- 발사체 발사: 총알이나 미사일이 발사되는 순간
- 충돌: 두 물체가 부딪히면서 발생하는 충격
C++ 예제: 스페이스바를 누를 때 액터에 위쪽으로 순간적인 힘을 가하는 코드
// 소스 파일 (.cpp)
void AMyActor::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AMyActor::Jump);
}
void AMyActor::Jump()
{
FVector Impulse = FVector(0.0f, 0.0f, JumpImpulse); // 위쪽 방향으로의 충격
MeshComponent->AddImpulse(Impulse, NAME_None, true); // bVelocityChange를 true로 설정하여 속도 변화를 직접 적용
}
UPROPERTY(EditAnywhere)
float JumpImpulse = 500.0f;
이 코드는 "Jump" 액션(스페이스바)이 눌릴 때 액터에 위쪽 방향으로 JumpImpulse 값만큼의 순간적인 충격을 가합니다. bVelocityChange를 true로 설정하면 질량에 영향을 받지 않고 바로 속도 변화가 적용됩니다.
3. AddForce vs AddImpulse: 비교 정리
힘의 형태 | 지속적인 힘 | 순간적인 힘 |
프레임 속도 | 의존적 | 독립적 |
효과 | 시간에 따른 속도 변화 (가속) | 순간적인 속도 변화 (충격) |
비유 | 계속 밀기 | 한 번에 쾅 치기 |
적합한 상황 | 중력, 엔진 추력, 마찰력 등 지속적인 힘 | 폭발, 점프, 발사 등 순간적인 충격 |
4. 추가 팁: bVelocityChange
AddImpulse 함수에는 bVelocityChange라는 부울 매개변수가 있습니다.
- bVelocityChange = true: 충격량을 질량에 나누지 않고 바로 속도 변화에 적용합니다. 즉, 물체의 질량에 관계없이 동일한 속도 변화를 얻습니다.
- bVelocityChange = false (기본값): 충격량을 질량으로 나누어 속도 변화를 계산합니다. 즉, 무거운 물체는 가벼운 물체보다 속도 변화가 적습니다.
대부분의 경우 bVelocityChange = true를 사용하는 것이 직관적이고 편리합니다.
5. 결론: 상황에 맞는 선택이 중요!
AddForce와 AddImpulse는 각각 다른 방식으로 힘을 적용하기 때문에, 게임의 상황에 맞춰 적절하게 선택해야 합니다.
- 지속적인 힘이 필요하다면? → AddForce!
- 순간적인 충격이 필요하다면? → AddImpulse!
이 두 함수의 차이점을 명확히 이해하고 활용하면 더욱 현실적이고 역동적인 게임을 만들 수 있을 것입니다.
'프로그래밍' 카테고리의 다른 글
언리얼 엔진 5 (UE5)에서 월드 시간과 델타 시간 초 단위로 얻기 (C++ 및 블루프린트) (1) | 2025.01.13 |
---|---|
UE5에서 두 벡터 사이의 각도 구하기 (자세한 설명 + 내적의 의미) (0) | 2025.01.11 |
언리얼 엔진 5 (UE5) InterpTo 함수 완벽 분석: 부드러운 움직임의 핵심 (0) | 2025.01.02 |
"Local modification of AttachParent detected for replicated component , disable replication or execute detachment on host" 경고 발생 원인 및 수정 in 언리얼5 (0) | 2024.12.17 |
Unreal Engine 5에서 동적으로 Tick 제어하기 (1) | 2024.12.03 |