언리얼 엔진 본캠프 8주차-4 언리얼 엔진 C++ : Pawn 이동 방향

정재훈·2025년 2월 6일
0

unreal engine

목록 보기
24/45

Pawn 클래스를 키보드, 마우스로 조종하는 과제에 대한 해설 코드를 보고 이동에 관한 부분을 정리하였다

기본적으로 키보드 입력으로 들어오는 값(벡터)는 항상 World 기준 x축(w,s), y축(d,a), z축(shift, space bar)이기 때문에 이 값을 현재 캐릭터에 맞게 변환하지 않으면 w 키를 눌러서 앞으로 갈려고 할 때 앞으로 가지 않고 왼쪽이나 다른 방향으로 갈 수가 있다

이를 방지하려면 키보드 입력 값을 캐릭터가 보는 방향으로 회전시켜야 한다

위 코드는 캐릭터를 World 기준으로 이동시켜야하는 방향을 구하는 부분이다

코드에서 주요 코드가
FRotationMatrix(YawOnlyRotation).GetUnitAxis(EAxis::X)
YawOnlyRotation.RotateVector(Vector)
GetActorForwardVector() 시리즈
이렇게 3가지이다

  1. FRotationMatrix(YawOnlyRotation).GetUnitAxis(EAxis::X) : YawOnlyRotation인 상태에서의 X축 방향 단위 벡터를 반환한다
    • YawOnlyRotation이 0도이면 X축 단위 벡터는 (1, 0, 0)이고
    • 30도 이면 회전 공식(𝑋'= 𝑋cos(𝜃)−𝑌sin(𝜃), 𝑌'= 𝑋sin(𝜃)+𝑌cos⁡(𝜃))에 의해 X축 단위 벡터는 (0.866, 0.5, 0)이 된다
  2. YawOnlyRotation.RotateVector(Vector) : Vector를 YawOnlyRotation만큼 회전시켜 새로운 Vector를 반환
    • 이것도 YawOnlyRotation이 30도 이고 Vector가 (1, 0, 0)이면 새로운 Vector는 (0.866, 0.5, 0)이 된다
  3. GetActorForwardVector() : 현재 Actor의 정면 벡터를 반환하는데, 내부적으로 GetForwardVector()를 호출
    • => FRotationMatrix(YawOnlyRotation).GetUnitAxis(EAxis::X)와 같은 동작을 함

=> 결국 세가지 코드 모두 같은 동작을 한다

대신 무엇을 기준으로 이동을 할 것인지에 따라 셋 중 적절한 것을 선택해서 사용하면 될 것 같다.

  • 예를 들면 위 코드와 같이 카메라 정면을 기준으로 전진할 때는 1,2번을 사용하고 캐릭터(Actor)의 정면을 기준을 전진을 해야하면 3번을 쓰는 것이 좋아보인다

실제로 저 코드가 같은 값을 반환하는지 비교해보았다

  • 앞, 오른쪽, 위(드론) 방향으로 이동한다 가정했을 때
  • => 위 코드에서 MovementInput과 LocalInput이 (1,1,0), (1,1,1)인 경우

MovementInput의 X, Y는 IMC에서 IA을 키보드 Key에 매핑할 때 Modifiers의 Swizzle Input Axis Values를 어떻게 하느냐에 따라 달라짐

위 코드에서의 IMC 세팅

  • W/S : X축
  • A/D : Y축

다른 프로젝트에서의 IMC 세팅

  • W/S : Y축
  • A/D : X축
    • 코드
profile
드가자

0개의 댓글