Notice
Recent Posts
Recent Comments
Link
05-18 11:53
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

킹머핀의 제작 일지

VR) 유니티 XR Interaction Toolkit 터널링 효과 적용하기 본문

Unity

VR) 유니티 XR Interaction Toolkit 터널링 효과 적용하기

KingMUffin 2021. 5. 27. 19:00

우리가 모니터로 3D 영상을 시청하거나 게임을 할 때 시점이 연속해서 변화한다면, 모니터의 FOV가 클수록 즉 모니터가 넓을수록 멀미에 취약하다. 이 현상은 양안으로 보는 HMD 디스플레이에도 똑같이 발생한다. 그래서 HMD VR 콘텐츠의 고질적인 문제 중 하나인 멀미를 예방하려면 충실도(몰입감)를 일부 포기하면서도 시점이 연속해서 변화할 때 디스플레이의 FOV를 의도적으로 줄일 필요가 있다.

줄이는 방식은 다양하지만, '터널링 효과'가 보편적이다. '비네트/비네팅 효과'라고도 부른다. 말 그대로 터널처럼 보이게 한다. 영화에서 1인칭 주인공 시점으로 눈을 감았다 뜰 때를 상상하면 쉽다.

나는 내 졸업 작품의 일환으로, 사용자의 시점 변화 속도에 따라 터널링 효과를 조절하는 기능을 구현하기로 했다. 이 기능을 기획할 때만 해도 획기적이고 사례도 없을 줄 알았는데, 구현하려는 최근에 검색해보니 바로 나온다. 하긴 아직도 없을 리가..!

 

sigtrapgames/VrTunnellingPro-Unity

Plug-and-play VR comfort for Unity. Contribute to sigtrapgames/VrTunnellingPro-Unity development by creating an account on GitHub.

github.com

무려 오큘러스 사의 지원을 받아 개발했고 에셋 스토어에도 무료로 올라와 있다. 정말 다행인 점은, 이렇게나 수준 높고 강력한 에셋이 오픈 소스라는 점이다. 크~ 나는 적용만 하면 된다!

잠깐. 위에서 보여주는 영상은 모두 한 대의 가상 카메라로 보이는 모습이다. 위 링크의 설명란에도 유니티의 XR Interaction Toolkit을 지원한다는 얘기가 없으니 안심하긴 이르다. 일단 적용 후 바로 시험해보아야겠다.

XR Interaction Toolkit은 런타임에서도 카메라가 하나인데, 어떻게 VR 기기에서 두 대의 카메라를 이용하는 것처럼 양안에 따로 렌더링하는지 난 모른다. 알면 도움이 될 텐데 아직 알아볼 생각도 들지 않는다. 하지만 나중에 양안 전경에 격자를 그리기 위해 알아봐야 할 수 있다. 위 에셋이 HMD에서 제대로 표시된다면 그 원리를 대신 탐구해보는 방법도 있다.

위 영상에서는 유니티 포스트 프로세싱의 비네팅 효과를 사용했다. 확실히 XR Interaction Toolkit과 그 Locomotion을 이용한다. 하지만 마찬가지로 카메라 하나로 렌더링한 결과라 실제 적용 시에도 같을지는 아직 모름. 만약 위 에셋이 HMD에서 제대로 표시되지 않는다면 이 방법으로 시도해보겠다. (하지만 위 에셋도 포스트 프로세싱으로 효과를 구현하다고 한다) 어차피 포스트 프로세싱의 모션 블러도 필요하다.

(디스플레이에 직접 그리는 유니티 UI 캔버스로도 직접 시도해봤는데, 역시나 불가능하지만 양쪽 디스플레이에 대칭으로 그려질 거라는 예상과 다르게 오른쪽 눈 디스플레이에만 삐뚤게 그려지고 있었다. 쉐이더를 이용해서 시점을 분리해서 그런 걸까? 원리가 궁금하긴 하다..)


 

나는 위의 깃허브가 아닌 유니티 에셋 스토어에서 가져와서 프로젝트에 추가했다. 마지막 업데이트가 2019년이다. 어떤 오류를 뿜을지 기대된다.

샘플 씬을 열면 텍스쳐를 못 불러오는지 모든 오브젝트가 보라색이고, 런타임에서는 유니티의 구 입력 시스템을 사용한다고 오류를 마치 화산처럼 뿜어내고 있다. 그래도 쌤플 씬은 그냥 프리셋을 구경시켜주는 용도고, 자체 입력 시스템을 갖춘 기존 씬에서 잘 작동만 하면 그만이다.

 

VR Tunnelling Pro: Quickstart Guide

Simply place the Tunnelling script on your camera, link up the Motion Target to the root object moving the camera, and the default settings are good to go. Motion Target should be the object controlling artificial locomotion, not the camera TIP: Motion Tar

www.sigtrapgames.com

매뉴얼대로 카메라에 터널링 스크립트를 붙이고, 카메라의 최상단 부모 오브젝트를 Motion Target으로 정한 후 XR Device Simulator로 움직여보았다. 로코모션이 실행될 때마다 XRRig의 트랜스폼 변화를 감지한다.

에디터에서 디버그 설정을 활성화하면 Motion Analyzer에서 확인할 수 있다.

대충 봤던 위 매뉴얼을 자세히 읽어보자.

TIP: Motion Target should be the object creating artificial locomotion to which the camera is attached. Do not link it to the camera's gameobject unless you have a specific purpose in mind. Doing so will drive the effect from the user's head motion, which is pointless as real head motion does not cause sim-sickness.

For example, in a first-person racing game, Motion Target should be the car.

머리 움직임만으로는 멀미가 유발되지 않는다고? 어떻게 그런 말을 할 수가! 모든 가상 현실 환경에 적용할 수 있으려면 머리부터 가상의 움직임까지 모두 멀미를 유발할 수 있다는 경감식을 가져야 한다는 게 내 결론이다.
그러면 Motion Target을 상위 오브젝트와 하위 오브젝트 중에서 정할 수 있게 만들면 좋을 것이다. (Motion Target을 해당 컴포넌트를 가진 카메라 자신으로 적용하면 그러지 말라고 경고하지만 무시하겠다.)

 

그런데, 화면에 터널링 효과가 나타나지 않는 건 똑같다. 어떻게 해결해야 하지? 샘플 씬을 다시 봐도 모르겠다. 카메라 컴포넌트의 포스트 프로세싱 렌더링 설정을 활성화해봐도, Target Eye Output을 한 눈으로 바꾸어봐도 그대로다. 이번엔 진짜 모르겠다.

 

VR 템플릿이 아닌 3D 템플릿으로 새 프로젝트를 만들어 적용해보았더니 터널링 효과가 잘 나타난다. 아무래도, 유니티 XR의 카메라 처리와 겹치는 문제같다. 그렇다고 그렇게 발생하는 오류 메세지는 하나도 없다..

그래도 이렇게 빨리 포기할 내가 아니지. (하지만 많은 경우에서 빨리 포기하는 편이 더 좋았었다) 혹시 오큘러스가 안드로이드에서 돌아가니까 데스크탑용 스크립트가 작동하지 않는 게 아닐까 해서 모바일 전용 스크립트로 교체해보았다.

오!! 뭐야! 또 기대 안 했는데 터널링 효과가 적용됐다!

ㅋㅋㅋㅋㅋ 왜 그러니까 이런 얘기는 왜 매뉴얼에 없냐고. 아무튼 해결이다. 나머진 알아서 해야지. &