본문 바로가기

컨퍼런스 노트/KGC

(KGC2014) 가상현실 콘텐츠 개발 가이드

(KGC2014) 가상현실 콘텐츠 개발 가이드


1. 플레이어에게 친절해지기

- VR개발자는 많은 시간은 HMD(Head Mount Display)를 보며 개발

> 개발자들은 초기의 많은 오류들에 지속적으로 노출되어 이내 이런 오류들에 적응하게 됨


- 유저들은 HMD를 처음 접하게 되므로 적혀 적응되어 있지 않다.

> 모든 오류들을 바로잡음으로써 진정한 '현장감'을 제공해야 한다.


- 너무 강한 VR 경험은 유저에게 극심한 혼란을 주며 게임의 룰을 방해한다.

  따라서 강력한 경험은 선택사항으로 만들어야 한다.

> 유저 바로 앞은 너무 많지 않게 폭발이나 파티클을 배치

> 가급적 움직임은 적게, 느리게 할 것

> 기본은 낮은 설정으로 해서 VR 초보자를 포용할 것

> 언제든 쉽게 VR 자극을 조절할 수 있도록 할 것


- 유저들은 서로 다른 반응을 가진다.

> 일부 유저에게는 안 좋았던 경험이 다른 이들은 아에 못 느낄 수도 있다.


- VR 내성을 모두 가진 사람은 없다.

> 어떤 부분에서 매우 민감한 사람도 다른 부분에선 괜찮을 수도 있다.


- 멀미내성은 간단히 습득할 수 있는 것이 아니다.


- "Oculus Best Practices"를 참고할 것


2. 전정안반사

- 맨 처음에는 시선고정 상태 : 움직이지 않는 사물을 고개를 돌려도 계속 보는 상태


- 머리를 회전하면 전정기관에서 인지한다.


- 주시하던 대상을 잃고 새 주시대상을 찾아야 할 때 새카드 안구운동(주시대상을 찾으려는 안구의 비약적 운동)이 일어난다.

  이때 이전에 주시하던 대상의 상이 일시적으로 눈에 남아있게 된다.


- 만약 물체가 초당 30도 이하로 느리게 움직인다면 새카드 안구운동은 일어나지 않는다.


- 전정안반사 이득이란, 머리 회전 움직임과 눈의 반응 비율을 의미하는 것으로, 일반적으로는 1:1 비율이다.

  (머리가 10도 회전하면 눈도 10도 회전)

> 시야가 압축된다면(안경을 쓴 경우, VR 안에서 잘못된 렌더링 스케일), 10도 회전했을 때 보정을 위해 안구가 5도

  회전한다고 하면 지속해서 쓰고 있다고 했을 때 적응하는데 1~2주가 소요된다.


- 전정안반사 이득 보정

> 일반적인 게임들은 Field of View를 조절할 수 있다.


> 모니터를 이용하는 게임들은 전정안반사 이득에 영향을 미치지 않는다.

  (유저의 머리를 돌려도 모니터가 움직이지 않음)


> 오큘러스 리프트를 쓰면 바라봐야 할 것은 모두 VR 안에 있다.

  VR 안에서 화면을 바라볼 때는 현실에서의 안구 움직임이 나타난다.


> VR의 Field of View 스케일은 마음대로 결정할 수 있는 것이 아니다.

  유저의 신체적 특징과 밀접한 관련이 있어서 고려치 않으면 심각한 고통을 유발할 것


> 오큘러스 리프트 디스플레이는 물리적 피치 "pixels per visible degree(보여지는 각도당 픽셀)"

  정확한 FOV값은 왜곡 정도, 사용자의 머리와 눈의 위치 등에 따라 달라진다.

  user configuration tool을 활용할 것


> SDK는 이 피치를 정확하게 일치시키는데 도움을 준다.

  유저의 신체적 특징을 설정하면 올바른 FOV와 스케일을 적용해준다.


- 가급적이면 FOV의 변화나 줌 효과는 피해야 한다.

  10도의 머리 회전이 일어나면 화면 상으로도 10도의 회전만 줘야 하며, 약간이라도 맞지 않으면 멀미를 유발한다.


3. IPD, eye-relief, and the neck

- IPD : 동공간 거리

> 눈 마다 두 개의 요소가 필요하다 : 코와 동공 사이의 거리, Eye-rlief-동공과 렌즈 사이와의 거리

> HMD의 크기는 관련이 없다.

> Oculus Configuration Utility에서 세팅 : IPD를 측정하고 Eye Cups를 세팅 후 유저 프로필 저장

> 대부분의 사람들은 양 눈과 코 사이 거리가 비대칭이다.


- 재정렬 : sensor -> Recenter()

> 앱에서 리셋 버튼 할당

> 자연스럽게 앉은 상태에서 리셋 버튼을 눌러 위치 리셋

> 머리의 방향도 함께 리셋

> 피치나 롤은 중력 벡터로 정렬


- 동공 사이의 중심점을 이용

> HMD의 중심선이 된다.

> 왼쪽 오른쪽 eye-relief의 평균값을 이용한다.


- 플레이어가 자신이 여기에 있다라는 느낌을 받을 수 있도록 하는 것들

> Audio listener 위치

> 기준 가시선

> Crosshair의 기준 위치


- 머리가 기울어질 때 SDK를 이용하여 중심점의 위치와 방향을 받아온다.

  여기에 중심점에 대한 벡터를 더하여 렌더링할 가상 카메라의 위치가 결정된다.


- 모든 움직임은 실제 치수와 동일하게 적용된다.

  이 값은 변경하면 어지러움증을 유발하므로 자유롭게 변경할 수 없다.


4. world scale 바꾸기

- IPD값은 변경할 수 없으나 world scale은 변경할 수 있다.


- 변경할 때는 스케일, 미간 중심선, 머리 움직임이 동등하게 변경되어야 한다.


- 월드 전체 스케일 변경과 동일한 효과를 볼 수 있다.

  모든 게임 오브젝트를 줄일 필요 없이 간단히 조절할 수 있음.


- 월드 스케일을 줄이는 것은 때로 멀미를 줄이는 효과를 가져온다.

  움직임, 가속도가 함께 줄어들기 때문인데, 너무 줄여도 곤란해진다.


5. 플레이어의 눈높이 설정

- 플레이어의 키를 Configuration Utility에서 설정할 수 있다.(SDK에서 플레이어의 눈높이를 다시 계산)


- 설정된 값으로 VR에서 플레이할 경우 가상환경에서도 현실과 동일한 스케일의 느낌을 얻을 수 있다.


- 그런데 만약 눈높이가 달라진다면? : 캐릭터는 서있지만 플레이어는 앉아있다. 우리의 뇌는 현재 앉아있는 것으로 인식한다.

> 만약 앉은 높이에 맞추서 월드 스케일을 변화시키면 세상이 더 작아진다.

> 스케일 변화는 고차원의 인지 작용이지만, 멀미와는 크게 상관이 없다.


- 해결책

> 앉아있는 아바타를 사용하면 어느정도 해결가능

> 실제 월드 스케일을 상황에 맞게 더 크게 하는 방법

> 그냥 작게 느껴지는 월드 스케일을 그대로 사용

> 서서 짧은 플레이를 하도록 유도

> 더 많은 연구 필요


6. Transition animation

- 카메라 방향을 강제로 회전시키면 안 된다.

> 항상 헤드 트래킹은 작동되도록 해놓자

> 강제로 이동하는 경우 많은 어지러움증을 유발한다.


- 스토리나 이동을 위해 애니메이션 전환이 필요한 경우 해결책

> 대안1 : 3인칭으로 아바타가 하는 행동 보여주기

 ㆍ1인칭에서 3인칭 시점 변환시 주의할 것

 ㆍ반투명 아바타를 활용하는 방법도 있다.


> 대안2 : dissolve나 fade out 효과 사용하기

 ㆍ단순 정지 이미지가 아닌 리얼타임 렌더링 활용

 ㆍ헤드 트레킹은 계속 작동되면서 주변을 돌아볼 수 있도록 한다.


> 대안3 : 잠깐 깜빡임을 통해 장면 전환

 ㆍ눈꺼풀을 감듯이 주변으로부터 어두워지는 효과

 ㆍ눈을 감고, 이동하고, 눈을 뜨고

 ㆍ매우 빠른 속도면 어떤 유저들은 인지하지 못하는 경우도 있다.


- Animated avatars : 1인칭 아바타의 애니메이션은 놀랍다!

> 놀라운 감각과 현장감을 느낄 수 있다.

> Team Fortress2 예시 : 하이 파이브, 손을 얼굴에 갔다대고 의무관 외치기, 저격수의 새

> 제약 조건

 ㆍ가상 카메라는 항상 플레이어의 실제 머리 위치에 있어야 한다.

 ㆍ가상 카메라와 아바타의 머리는 몰입을 위해 항상 일치해야 한다.

 ㆍ이런 조건들이 서로 상충될 수도 있다.

> 해결책 : meat hook avatars


7. meathook avatars

- 우선 아바타의 애니메이션을 플레이


- 아바타의 머리 위치를 찾아서 스켈레톤에 미간 중심선의 본을 추가


- 머리를 날려 버린다.

> 머리 본의 사이즈를 0으로 만든다거나. 이빨이나 안구 모델링이 남아선 안 된다.


- 플레이어의 가상 카메라의 위치를 찾는다.

> SDK로부터 얻은 기본 헤드 포지션 위치


- 아바타를 고리에 매단다.

> 플레이어의 위치에 머리 위치를 고정, 단 방향은 고정시키지 않는다.

> 애니메이션 되고 있는 몸은 머리 아래서 허우적 거리는 형태가 된다.

> 외부 카메라로 봤을 땐 굉장히 이상해보일 수도 있으나 VR 안에서는 잘 작동한다.


8. Framerate

- 높은 FPS 유지는 VR의 현실감에 필수적이다.


- DK2는 75hz, Crescent Bay는 90hz까지 지원한다.


- 낮은 Framerate에서는 심각한 멀미를 유발하게 된다.


- 이 Framerate로 Stereo 렌더링(좌안, 우안)은 매우 힘든 일이다.

> Framerate와 낮은 latency를 맞추기 위해서는 디테일을 낮추거나 적은 이펙트를 사용해야 한다.

> Framerate를 맞추는 것은 많은 효과를 주는 것보다 더 좋은 느낌을 전달한다.


- draw call과 fillrate에서 많은 연산이 필요하다.


- 프레임레이트 유지 - draw calls

> 각 눈에 해당하는 두 개의 장면을 연산하기 위해 두 배의 draw call이 들어간다.

 ㆍ새로운 APIs(Mantle, DX12 등)들은 VR연산을 고려해야 할 것이다.


> 한 번만 적용되어야 하는 것들

 ㆍCulling - 양 눈에 적용되는 하나의 절두체 사용

 ㆍAnimation

 ㆍShadow buffer rendering

 ㆍSome distant reflection/gloss maps/AO renders - 전부는 아니다.

 ㆍSome deffered lighting techniques


9. 정리

- 플레이어에게 친절해 지기

> 일반유저에게는 멀미 요소는 줄이고, 하드코어 유저에겐 더 강한 자극


- 전정안반사 이득

> FOV scale은 임의가 아닌 유저의 프로필에 셋팅된 값이 적용되도록


- IPD and head motion

> 반드시 서로 연관되도록 – 유저의 프로필 값 적용


- World scale 바꾸기 & 플레이어의 눈높이 설정

> 스케일 체감의 차이 정도만 작용, 멀미에는 크게 영향을 미치지 않음


- Transition animations

> 가급적 피하며 만약 써야 한다면 서서히 움직이는 것보다 순간적인 이동을 적용


- Meathook avatars

> 외부 카메라로 보기엔 이상하지만 1인칭에서는 좋은 효과


-Framerate

>프레임레이트는 우선 고려해야 할 1순위