1. 드론 움직임의 주요 특징
A. 기울기와 방향에 의존적인 이동
- Pitch, Roll, Yaw 조합으로 방향 결정
- 드론은 Pitch(앞뒤 기울기)와 Roll(좌우 기울기)로 움직이는 방향을 정하고, 이를 Yaw(수평 회전)과 조합해 입체적으로 움직인다.
- 예:
- Pitch 감소 (드론 앞부분 기울임) → 전진.
- Roll 증가 (왼쪽으로 기울임) → 왼쪽으로 이동.
- Yaw 회전 → 방향을 틀면서 다른 방향으로 이동.
- 이동 방향은 기울어진 드론의 방향에 따라 달라짐
- 예를 들어, 드론이 앞으로 이동하려면 Pitch로 기울인 방향을 기반으로 Forward Vector를 계산해야 한다.
B. 관성 및 가속/감속 효과
- 관성(Inertia)
- 드론은 공중에서 움직일 때 즉시 정지하지 않고, 일정한 관성에 따라 조금 더 이동한다.
- 예:
- 속도를 줄이는 입력을 넣더라도 관성 때문에 천천히 멈춘다.
- 가속 및 감속
- 드론은 바로 최고 속도에 도달하거나 멈추지 않습니다. 가속/감속을 반영해야 더 자연스럽다.
- Unreal에서는 FMath::FInterpTo를 사용해 부드러운 속도 변화를 구현할 수 있다.
C. 공중 움직임의 균형 (Gravity와 Drag)
- 중력(Gravity)
- 드론은 공중에 떠 있는 동안 중력에 의해 아래로 당겨지는 힘이 존재.
- 따라서, 입력이 없을 때 드론은 점점 하강하게 된다.
- Unreal에서는 GetWorld()->GetDeltaSeconds()와 FVector(0, 0, -GravityStrength)로 이를 구현할 수 있다.
- 공기 저항(Drag)
- 드론은 속도가 높아질수록 공기 저항으로 인해 속도가 줄어드는 효과가 있다.
- Drag를 추가하면 특정 방향으로 너무 빠르게 가는 것을 막고 현실감을 준다.
D. 드론의 안정화
- 자동 균형 잡기 (Self-Stabilization)
- 드론은 입력이 없는 경우 기울기(Pitch, Roll)를 자동으로 0으로 되돌리려는 경향이 있다.
- 현실에서 드론은 내부 센서(IMU, 자이로스코프)를 사용해 균형을 맞춘다.
- Unreal에서는 FMath::FInterpTo를 활용해 점진적으로 회전을 0으로 보정할 수 있다.
- 바람/외부 힘의 영향
- 외부 환경(바람, 충돌 등)으로 인해 드론이 불안정하게 흔들릴 수 있다.
E. 드론의 입력과 반응
- 선형 입력 → 회전 및 속도 변화
- 입력값은 드론의 기울기 변화(Pitch, Roll, Yaw)를 통해 방향을 조정.
- Unreal에서는 AddActorLocalRotation이나 AddActorLocalOffset을 사용해 입력값을 처리.
- 입력 비례 회전
- 입력값이 클수록 드론의 회전 속도/기울기 변화가 더 커져야 한다.
- 이를 위해 InputAxisValue와 DeltaTime을 조합하여 선형 비례 입력을 처리.
2. 드론 움직임 구현 아이디어
A. Pitch, Roll, Yaw로 이동 방향 계산
드론의 기울어진 방향에 따라 이동하려면, 드론의 현재 방향 벡터를 기반으로 이동을 계산해야 한다.
void ADronePawn::UpdateMovement(float DeltaTime)
{
// Pitch와 Roll에 따라 방향 계산
FVector ForwardVector = GetActorForwardVector(); // 전진 방향
FVector RightVector = GetActorRightVector(); // 오른쪽 방향
// 입력값에 따라 속도 조정
FVector Movement = (ForwardVector * CurrentForwardSpeed) +
(RightVector * CurrentRightSpeed);
// 중력 효과 적용
Movement += FVector(0.0f, 0.0f, -GravityStrength * DeltaTime);
// 이동 적용
SetActorLocation(GetActorLocation() + Movement * DeltaTime, true);
}
B. 가속/감속 효과 (관성)
가속/감속을 위해 FMath::FInterpTo를 활용하여 부드러운 이동을 구현.
void ADronePawn::UpdateSpeed(float ForwardInput, float RightInput, float DeltaTime)
{
// 입력값에 따라 목표 속도 계산
float TargetForwardSpeed = ForwardInput * MaxSpeed;
float TargetRightSpeed = RightInput * MaxSpeed;
// 현재 속도를 점진적으로 목표 속도로 변경
CurrentForwardSpeed = FMath::FInterpTo(CurrentForwardSpeed, TargetForwardSpeed, DeltaTime, AccelerationRate);
CurrentRightSpeed = FMath::FInterpTo(CurrentRightSpeed, TargetRightSpeed, DeltaTime, AccelerationRate);
}
C. 기울기(Pitch, Roll) 복원
입력이 없을 때 드론의 기울기를 자동으로 0으로 처리.
void ADronePawn::StabilizeDrone(float DeltaTime)
{
// Pitch와 Roll을 점진적으로 0으로 보정
CurrentPitch = FMath::FInterpTo(CurrentPitch, 0.0f, DeltaTime, StabilizationSpeed);
CurrentRoll = FMath::FInterpTo(CurrentRoll, 0.0f, DeltaTime, StabilizationSpeed);
// 드론의 최종 회전 적용
FRotator NewRotation = FRotator(CurrentPitch, GetActorRotation().Yaw, CurrentRoll);
SetActorRotation(NewRotation);
}
3. 드론의 움직임 흐름
- 입력값 → 속도 업데이트
- 사용자가 입력한 값에 따라 목표 속도 및 기울기(Pitch, Roll)를 변경.
- 속도 → 이동 방향 계산
- 기울기와 방향을 기반으로 이동 벡터를 계산.
- 중력과 안정화 적용
- 중력 효과로 하강하고, 입력이 없을 때 기울기를 점진적으로 복원.
4. 최종 구현 구조
Tick 함수에서 위 로직들을 호출하여 순차적으로 처리.
void ADronePawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 속도 업데이트
UpdateSpeed(InputForward, InputRight, DeltaTime);
// 이동 처리
UpdateMovement(DeltaTime);
// 드론 안정화
StabilizeDrone(DeltaTime);
}
5. 추가 개선점
- 바람 효과: 랜덤한 외부 힘을 추가.
- 드론 카메라 흔들림: SpringArmComponent를 활용해 충격 시 흔들림 추가.
✏️ 설날 휴가중이라 직접 구현은 못했지만 비행체 움직임에 대해 알아보았습니다. 조만간 직접 적용 예정!
'TIL > C++와 UE' 카테고리의 다른 글
게임 메뉴 UI 디자인 (0) | 2025.02.07 |
---|---|
Pawn 클래스 캐릭터의 부드러운 움직임 (1) | 2025.02.05 |
회전 관련 함수 및 Pawn 클래스 Look 함수 (1) | 2025.01.27 |
충돌 검사 (0) | 2025.01.24 |
Pawn 클래스 다루기 (0) | 2025.01.23 |