[UE5][VR] Unreal Engine 5 VR Study (4)

suhan0304·2023년 12월 2일
0

Unreal Engine 5

목록 보기
4/10
post-thumbnail

SnapTurn 함수 생성

이제 IA_VR_Turn을 구현해보자. 이때 Turn은 SnapTurn이라는 함수를 만들어서 해당 함수 안에 구현해보자. 이 때 SnapTurn에서 회전 방향을 알고 있어야 하므로 input에 bRightTurn으로 변수를 만든다.

Action Value가 0보다 크다면 오른쪽으로 고개를 돌린 것이므로 True를 그대로 넘겨주고 0보다 작다면 왼쪽을 고개를 돌린 것이므로 False를 넘겨주기 위해 greater 노드를 써서 위와 같이 연결 시켜준다.

계속해서 누른 상태일때 SnapTurn을 실행 시키고 싶다면 Triggered에 눌렀을때 한번만 살짝 돌아가도록 하고 싶다면 Started에 연결시켜 구현하면된다.

SnapTurn 회전 구현

고개 틀어줄 정도를 정해주기 위해서 함수 내에서 사용할 지역 변수로 선언해주어도 괜찮지만 회전 각도 자체가 BP_Pawn의 특성이기도 하기 때문에 전역 변수로 선언 해준후 초기 값을 -45로 설정한다.

Right Turn이 True이면 오른쪽으로 고개를 돌려야하므로 -45를 45로 바꿔주어야하고 Left Turn인 경우에는 그냥 -45 그대로 회전 시켜준다.

이제 해당 각도를 구했으면 Add Actor World Rotation의 좌표를 split하고 y에 연결해준 후 Teleport 옵션을 체크해서 천천히 움직이는 것이 아니라 바로 45도가 한번에 회전하도록 설정한다.

실제로 실행하면 Turn이 작동한다. 하지만 VR Pawn의 Snap Turn 함수와 비교해보면 많이 다른다는 것을 알 수 있다.

그럼 기존의 방식에서 어떠한 가공 절차가 더 들어가야한다는 점인데 어떤 점이 잘못된 것일까?

잘못된 회전 방식

현재 VR로 플레이를 해보면 고개 회전에 따라 자유롭게 시점이 회전한다. 뭐가 회전하는 것일까? 바로 카메라가 내 시야에 맞게 회전하고 움직이고 있는것이다. 그렇기에 내 시야가 BP_Pawn에서 멀리 벗어난 상태에서 회전을 하게되면 내 카메라를 축으로 회전되는 것이 아니라 BP_Pawn을 기준으로 회전하게 되며서 단순히 시야만 회전하는 것이 아니라 내 위치 또한 공전하는 느낌으로 회전된다.

위 그림을 보자. 만약 카메라와 BP_Pawn이 동일한 좌표에 위치한 상태에서 BP_Pawn을 회전하면 카메라도 같이 회전하면서 시야만 회전하는 우리가 원하는 효과로 작동한다.

하지만 카메라가 BP_Pawn과 일치하지 않는 상황에서 BP_Pawn을 회전시키면 카메라도 BP_Pawn을 축으로 같이 회저되게 되고 우리의 시점은 카메라를 기준으로 삼기 때문에 시야가 회전한 것 뿐만 아니라 살짝 이동하게 된다. 이러한 회전은 우리가 원하는 회전이 아니다.

VRPawn 분석

VRPawn에서는 Camera의 월드 좌표를 Local Camera Location에 저장해주고 Camera의 지역좌표가 Local Camera Relative Transform에 저장되는데 이 좌표는 BP_Pawn을 기준으로 만들어지는 좌표로 BP_Pawn에서부터 얼마나 어느 방향으로 떨어져있는가를 나타내는 좌표라고 생각하면 된다.

이제 기존의 좌표에서 원하는 각도만큼 회전 정도만큼 회전한 transform을 Self의 Location에 Local New Transform이라는 이름으로 새로 만들어준다.

이제 필요한 정보들은 모두 저장해놨으므로 실제로 오브젝트를 공전시킨다.

이제 아까 구했던 카메라의 상대 위치와 위에서 새로 만들어 놓은 New Transform을 Combine 해준다. 이렇게 되면 아까 제자리에서 회전한 New Transform을 카메라의 상대 위치에 가져다 놓은 후 공전 시킨것과 동일한 효과로 공전한 카메라의 transform을 얻을 수 있다. 이 때 기존의 카메라 위치에서 공전한 카메라의 위치를 빼주면 공전한 위치에서 기존 카메라 위치의 벡터를 얻을 수 있다. 이제 공전한 위치에 있는 오브젝트에 해당 벡터를 더해서 다시 기존의 위치로 끌고 올 수가 있다.

BP_Pawn의 위치도 같이 보정된다.

즉, 위의 과정은 공전한 다음 공전한 위치에서 기존의 위치로 끌어오는 과정을 위한 블루 프린트라고 할 수 있다. 이런 과정을 거치면 플레이어 입장에서는 제자리에서 고개만 돌린 것 같은 느낌을 받을 수 있다.


BP_Pawn 구현

이제 위에서 이해한 바를 바탕으로 BP_Pawn의 회전 방식을 보정해보자. LocalYawDelta로 회전 정도를 저장해두고, LocalPrevCameraLocation으로 카메라의 원래 위치를 기억할 변수를 생성한다.

그런 다음 아래와 같이 구현할 수 있다.

원리는 아래와 같다. 기존의 카메라의 월드 로케이션 정보를 선언해둔 변수에 저장해두고 회전(공전)을 진행한다.

그런 다음 변경된 현재 카메라의 위치에서 기존 카메라의 위치를 빼서 아까 위에서 VRPawn이 그랬던 것처럼 카메라의 이동 벡터를 찾는다. 그런 다음 해당 벡터만큼 BP_Pawn의 월드 좌표를 이동시켜주면 VRPawn과 같이 기능을 하지만 BP는 더 간단하게 구현한 것을 확인할 수 있다.


비교

개선 전

박스 옆에서 고개(카메라)를 앞으로 내민 다음 오른쪽으로 회전하니깐 카메라가 BP_Pawn을 기준으로 공전하면서 카메라가 박스 안으로 들어가버린다.

개선 후

박스 옆에서 고개(카메라)를 앞으로 내민 다음 오른쪽으로 회전하니깐 카메라를 기준으로 회전이 되면서 박스의 옆면이 보이도록 회전이 되는 것을 확인할 수 있다.

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글