(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순위