시점 구현

CJB_ny·2023년 1월 15일
0

UE4

목록 보기
20/20
post-thumbnail

GTA 인칭 구현

GTA와 같은 방식을 구현을 할려면은

카메라가 회전을 하고 카메러가 바라보는 방향으로 캐릭터가 움직일 수 있도록 해야한다.

회전과 방향의 관계

회전과 방향은 다음과 같은 관계가 있다.

엑터의 회전 값 (0, 0, 0)은 그 엑터가 바라보는 방향이 월드의 X축 방향 (1, 0, 0)을 의미한다.

월드의 X축 방향은 기본 회전값에 대응하는 방향값이라 할 수 있다. 즉, 엑터가 회전하면 액터의 시선방향도 자연스럽게 다른 값으로 변한다.

SpringArm의 회전값은 옵션에 의해 컨트롤 회전값과 동일하다.

컨트롤 회전값이 카메라가 바라보는 방향이라고 할 수 있다.

이 컨트롤 회전값으로 부터 "회전 행렬"을 생성한 후, 원하는 "방향 축"을 대입해 캐릭터가 움직일 방향 값을 가져올 수 있다.

(언리얼 엔진에서 시선방향을 X축, 우측 방향은 Y축을 의미한다)

회전 값으로 부터 벡터값 얻기

GTA 방식

AddMovementInput(FRotationMatrix(GetControlRotation()).GetUnitAxis(EAxis::X), NewAxisValue);

GetControlRotation() 함수로 부터 컨트롤 회전값을 얻어온 다음에. FRotationMaxtrix함수를 통해 회전행렬을 생성을 하였다.

이후 이 회전행렬에 X방향축(GetUnitAxis(EAxis::X)) 을 대입해서 NewAxisValue만큼 움직이겠다라는 말이다.

위의 코드는 FRotationMatrix는 "회전된 좌표계"를 저정하는 행렬이다.

GTA시점은 FRotator값으로 회전행렬을 생성하고 이를 토대로 변환된 좌표계의 X, Y축 방향을 가져왔다.

DIABLO 방식

위의 코드에서 처럼 UpDown입력이 발생을 하면은 case DIABLO로 넘어오게 되는데, 이때 DirectionToMove라는 벡터의 X축에 NewAxisValue가 들어가진다.

이후 Tick함수에서는

GetController()->SetControlRotation()라는 함수로 현재 컨트롤러의 회전 하는 회전값을 설정을 해주는데

FRotationMatrix로 회전된 좌표계를 저장하는 행렬에다가

하나의 벡터 값과 이에 직교하는 나머지 두 축을 구해 회전행렬을 생성하고, 이와 일치하는 FRotator값을 얻어오는 방식을 사용함.

정리하자면, UpDown함수에서 Event가 발생해서 DirectionToMove벡터의 X축에 값이 들어갔는데,

이 DirectionToMove의 X축(하나의 벡터값) 에 직교하는 나머지 두 축을 구하는 함수가 "MakeFromX"함수이다.

즉, 하나의 벡터로부터 회전행렬을 구축하는 함수가 "MakeFromX(), Y(), Z()"이다.

LeftRight의 경우 DirectionToMove의 Y축에 값을 대입한뒤 Tick함수에서 MakeFromX를 통해 회전행렬을 생성을 하는데

MakeFromX 는

함수는 입력 파라미터 벡터를 X축으로 하여 새로운 기저를 구축하고, 그 기저로의 회전 행렬을 리턴한다.

그러면 위에 DirectionToMove의 Y축을 입력파라미터로 간주하고 이를 X축으로 하여 새로운 기저를 구축하고 새로은 회전행렬을 Return한 것이다.


그래서 LeftRight키가 입력이 되면은 Y축 벡터를 X축으로 하여 새로운 기저를 구축하고, 그 기저로의 회전행렬을 return받아서

AddMoveMentInput(DirectionToMove)를 넘겨주게 되니까 3인칭에서 해당 방향으로 잘 가는 것이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글