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

suhan0304·2023년 12월 2일
0

Unreal Engine 5

목록 보기
1/10
post-thumbnail

소개

언리얼5로 VR 게임 개발을 위한 스터디를 진행한 내용을 요약 및 정리해둔다. 복습 및 추후 게임 개발할 때 참고할 예정이다.


VR 프로젝트 생성

게임의 가상현실을 선택한 후에 VRTemplate 프로젝트를 하나 생성해준 후 실행한다..


C++로 다시 빌드하기

툴 > C++ 클래스 새로 만들기를 누른 후 아무 클래스를 하나 생성해줘서 C++로 사용할 수 있다.

생성이 완료되면 언리얼 엔진을 모두 끈 다음에 해당 프로젝트 폴더 > Source > 프로젝트명의 아무 스크립트를 열어주고 VR 개발에 필요한 수정을 진행해준다.

이후에 DerivedDataCache, Intermediate, Saved, *.sln을 모두 삭제해준 후 *.uproject를 우클릭 해서 Generate VisualStudo project fiels를 선택해준다.

이후에 프로젝트 파일을 열어서 다시 빌드하면 C++ 클래스를 사용할 수 있다.

만약 uproject 파일이 언리얼과 연결되어있지 않다면 해당 문서를 참고하자.

강의는 블루프린트로 진행할 예정이다.


UE5 제공 템플릿

나중에 기회가 되면 UE5에서 VRTemplate로 제공하는 BP들을 분석하는 것도 공부에 도움이 될 것이다.


기본 레벨 설정

현재 VRTemplate 맵을 DevMap으로 저장해서 사용한다.
파일 > 다른 이름으로 현재 레벨 저장을 이용해 현재 맵을 DevMap으로 저장 후 편집의 프로젝트 세팅의 맵&모드에서 시작 맵을 DevMap으로 설정한다. 이렇게 설정하면 앞으로 해당 프로젝트를 열 때마다 DevMap에서 자동으로 시작할 수 있다.

라이팅 빌드를 다시 해줘서 라이팅 오류를 없애주자. 빌드 > 라이팅만 빌드를 선택해 라이팅만 다시 빌드해줄 수 있다. (시간이 어느정도 소요됨)

시간이 지나면 아래와 같이 라이팅 빌드 오류가 없어지고 정상적으로 라이팅이 적용되어있는 장면을 확인할 수 있다.


BP_Pawn 생성

폰을 상속받도록 BP_Pawn이라는 이름으로 블루프린트를 생성한다. 이후에 MotionController 2개와 Camera 컴포넌트를 아래와 같이 추가해준다.

RightMotionController의 컴포넌트의 Details에서 Motion Controller을 오른쪽(Right)로 바꿔준다.

기본 값이 Left라서 LeftMotionController는 바꿔줄 필요가 없다.

이후에 두 모션 컨트롤러 모두 Visualization을 True로 체크해준다.


BP_GameMode 생성

Game Mode Base로 BP_GameMode 블루프린트를 생성해준다. 이제 에디터의 현재 게임 모드를 BP_GameMode로 설정해주고 Default Pawn Class를 아까 만들어준 BP_Pawn으로 설정해준다.

언리얼 엔진 5는 FPS 게임 개발을 위한 엔진이다 보니 구조가 FPS 게임 만들때 유용한 식으로 되어있다.

실제 실행을 시켜보면 헤드셋과 컨트롤러가 잘 인식되는 것을 확인할 수 있다. 아무런 작동을 하지 않더라도 굉장히 중요한 의미가 있는데 직접 인위적으로 좌표를 조작하지 않더라도 컨트롤러의 움직임에 따라서 트래킹을 해서 실제로 좌표가 알아서 조절이 된다는 것도 확인할 수 있고, 좌우를 두리번 거려도 그에 따라서 카메라 좌표도 자동으로 회전한다는 것을 확인할 수 있다.

즉, 카메라, 모션 컨트롤러(왼쪽, 오른쪽)만 설정해줘도 알아서 트래킹이 작동한다는 것을 알 수 있고 좌표 또한 실제로 움직임에 따라 자동으로 움직이는 것을 알 수 있다.


어떤 원리로 작동하는 것일까?

VR Template BP 에서 VRPawn을 살펴보도록 하자.

BP_Pawn이 실행되면 헤드셋을 머리에 착용하고 있는지 확인하고 착용하고 있다면 Set Tracking Origin을 실행한다. 이 Set Tracking Origin이 어떤 함수인지 로그를 찍어보기 위해 기존 BP_Pawn으로 돌아와 다음과 같이 BP를 작성해주었다.

VRPawn과 동일하게 시작하자마자 Set Tracking Origin을 실행하며 Tick당 Pawn의 월드 z 좌표와 카메라의 월드 z 좌표를 출력해준다.

실제로 보면 카메라의 높이가 0이 아니라 약 122 증가한 값으로 설정된 것을 확인할 수 있다.

실제 Floor 레벨은 초기 VR 설정 과정에서 안전 구역으로 설정한 영역의 Floor 레벨을 기준으로 현재 헤드셋과 높이 차이가 실제로 보정이 되어 BP Pawn에 적용이 되어서 카메라의 높이에 적용된다고 할 수 있다.

더 자세한 확인을 위해 Scene 컴포넌트를 VRRoot라는 이름으로 추가한 후 높이(z)를 100으로 설정한다. 다음과 같이 BP를 수정한 후에 결과를 확인해본다.

아까보다 카메라가 더 높은 곳에 있어서 공중에 떠 있는 느낌이 든다.

결과를 보면 Pawn의 고정 좌표는 0으로, VRRoot의 좌표 또한 100으로 고정되있다. 결국 카메라의 높이는 카메라를 기준으로 하는 직속상관인 VRRoot를 기준으로 땅을 기준으로 측정한 높이만큼 더해진다는 것을 확인할 수 있다.

인위적으로 계층 구조를 만들어 VRRoot를 왔다갔다 하게 되면 Pawn에는 영향을 주지 않고 높이를 원하는 만큼 올리고 내릴 수 있다. (원하는 높이를 강제로 보정해줄 수 있다.)

폰 자체를 움직이면 폰 좌표 자체가 변경되므로 문제가 발생할 수 있으나 폰 자체의 좌표에서는 영향을 주지 않고 VRRoot의 높이만으로 카메라의 높이를 조절할 수 있다는 사실을 알 수 있다.


눈높이 고정

그럼 우리가 원하는 눈높이로 고정을 한 번 시켜보자. (트래킹 오리진과 관련된 부분들에 의존하지 말자! 버그가 굉장히 많은 상태이다. ) 목표 높이를 DesiredCameraHeight를 Float형 변수로 선언해준 다음 초기 값을 75로 설정한다.

내가 원하는 높이랑 실제 카메라 높이가 다르다고 하면 그 차이만큼 VR 루트의 위치를 보정시키게 된다면 우리가 원하는 위치로 고정할 수 있다.

delay를 넣어준 이유? 모션 트래킹이 들어가서 높이가 조절되는데 시간이 걸린다. 바로 위치 보정을 해버리면 카메라의 초기 위치 0, 0, 0을 기준으로 위치 보정이 들어가버린다. 따라서 딜레이를 어느 정도 줘서 모션 트래킹으로 높이가 설정된 다음 위치 보정을 들어가도록 한다.

실행하고 움직이지 않으면 해당 위치가 보정되어 75 주변에 위치해 있는 것을 확인할 수 있다. 이제 게임을 시작할 때 실제 모션 트래킹의 높이에는 상관없이, 플레이어의 키의 높이에 상관없이 높이가 항상 75로 고정된 체로 시작할 수 있다.


플레이어 스타트는 어떤 역할을 할까?

플레이어 스타트의 높이를 200으로 설정 후에 실행시켜보자.

우리의 눈높이(카메라 높이)는 VRRoot가 -45로 내려오면서 75로 보정되었지만 폰은 아직도 200의 높이에 위치 해있다.
이를 통해, 이러한 보정을 통해 플레이어 높이에 상관 없이 눈높이를 보정할 수 있다는 것을 알 수 있다.

하지만 플레이어와 실제 카메라의 높이가 괴리감있게 차이나면 플레이하는 사람 입장에서는 어색할 수도 있기 때문에 웬만하면 플레이어 스타트의 높이를 적절히 조절해서 보정되는 카메라 높이의 좌표에 플레이어가 위치되도록 하는 것이 좋다.


손 모양 매쉬 설정

모션 컨트롤러의 Visualization의 Mesh를 직접 설정해주는 방식이 아니라 모션 컨트롤러에 SkeletalMesh를 따로 추가해줘 보여주도록 작업해야한다.

왜 Mesh를 따로 추가?

추후에 "왼손으로 서랍을 잡았다고 가정하면" 손이 서랍에 정확한 모양으로 부착되도록 해야하는데 그러한 인위적인 조작을 위해서는 손을 자유롭게 움직일 수 있어야하는데 모션 컨트롤을 인위적으로 움직이면 모션 트래킹이 깨지게 된다. 따라서 손 모양 메쉬를 따로 만들어서 인위적인 움직임이 가능하도록 하는 것이다.

이제 스켈레탈 메쉬에 Mesh를 세팅한다. Mesh의 MannyXR_Left로 메쉬를 설정해준다. 이제 카메라가 보는 방향으로 맞춰주기 위해 Hand의 Rotation을 수정해준다.

  • Left Hand : -90, -90, 0
  • Right Hand : 90, 90, 0

이제 실행해보면 원하는 손이 잘 뜨는 것을 확인할 수 있다.
( 컨트롤러가 같이 뜨는 현상은 추후에 보정할 예정 )


profile
Be Honest, Be Harder, Be Stronger

0개의 댓글