AR/VR 입문서

이 튜토리얼은 Godot 게임 엔진에서 AR과 VR의 세계로 가도록 도와주는 발판이 될 것입니다.

Godot 3부터 AR/VR Server라고 하는 새로운 아키텍처가 도입됬습니다. 이 아키텍처를 기반으로 하여, 특정 구현을 인터페이스로 이용할 수 있게 되었습니다. 대부분은 GDNative로 만들어진 플러그인입니다. 이 튜토리얼은 순수히 핵심 아키텍처에 의해 추상화된 핵심 요소에 초점을 둘 것입니다. 이 아키텍처는 다양한 인터페이스로 배포되면서 모든 VR 경험을 만들기에 충분한 기능을 갖고 있습니다. 하지만 각 플랫폼은 추상화하기에 불가능한 독특한 기능을 갖고 있습니다. 그런 기능은 입문서의 영역을 벗어나는 것이므로 관련 인터페이스에서 서술하겠습니다.

AR/VR 서버

Godot를 실행하면, 사용 가능한 각 인터페이스는 AR/VR 서버에 알려집니다. GDNative 인터페이스는 싱글톤으로 설정됩니다; 인터페이스가 프로젝트의 GDNative 싱글톤 목록에 추가되는 만큼, 서버로 알려질 것입니다.

이용 가능한 인터페이스 목록을 반환하기 위해선 함수 get_interfaces()를 사용할 수 있습니다, 하지만 이 튜토리얼에서, 예제를 위해 네이티브 모바일 VR 인터페이스를 사용하겠습니다. 이 인터페이스는 폰에서 3DOF를 사용해 입체 이미지를 화면에 출력하도록 하는 간단한 구현입니다. 또한 Godot 코어로 데스크톱에서 화면을 출력할 수 있으므로, 프로토타입을 만들거나 이것과 같은 튜토리얼을 하기에 이상적입니다.

인터페이스를 활성화하기 위해, 다음 코드를 실행합니다:

var arvr_interface = ARVRServer.find_interface("Native mobile")
if arvr_interface and arvr_interface.initialize():
    get_viewport().arvr = true
var arvrInterface = ARVRServer.FindInterface("Native mobile");
if (arvrInterface != null && arvrInterface.Initialize())
{
    GetViewport().Arvr = true;
}

이 코드는 우리가 사용하고자 하는 인터페이스를 찾아 초기화합니다, 그리고 완료되면 메인 뷰포트를 인터페이스에 제한합니다. 마지막 단계에서는 뷰포트에서 인터페이스를 제어하여 뷰포트에 입체 렌더링과 같은 것을 자동으로 활성화하도록 할 것입니다.

For our mobile VR interface, and any interface where the main input is directly displayed on screen, the main viewport needs to be the viewport where arvr is set to true. But for interfaces that render on an externally attached device, you can use a secondary viewport. In the latter case, a viewport that shows its output on screen will show an undistorted version of the left eye, while showing the fully processed stereoscopic output on the device.

Finally, you should only initialize an interface once; switching scenes and reinitializing interfaces will just introduce a lot of overhead. If you want to turn the headset off temporarily, just disable the viewport or set arvr to false on the viewport. In most scenarios though, you wouldn't disable the headset once you're in VR, this can be disconcerting to the gamer.

새로운 AR/VR 노드

Godot에서 AR과 VR을 지원하기 위해 세가지 새로운 노드 타입이 추가되었고 AR만을 위한 추가적인 노드 타입 한 가지가 추가되었습니다. 다음과 같습니다:

  • ARVROrigin - 월드에서 원점
  • ARVRCamera - 위치 추적이 가능한 카메라의 특수 하위 클래스
  • ARVRController - 컨트롤러의 위치를 추적하는 새로운 Spatial 클래스
  • ARVRAnchor - 실제 세상 위치를 가상 세계에 매핑하는 AR 구현을 위한 기준점

AR/VR을 위해선 앞의 두 개가 씬에 있어야 하고 이 튜토리얼 역시 이 둘에 초점을 두고 있습니다.

ARVROrigin은 중요한 노드로, 씬 어딘가에 반드시 있어야 합니다. 이 노드는 실제 세상의 중심을 가상 세상의 한 위치에 매핑합니다. 다른 모든 것들은 이 점으로 위치를 추적합니다. 이 점이 하나의 구현에서 다른 구현으로는 다르지만, 이 노드가 작동하는 방식을 이해하기 위한 최선의 예는 방 규모 장소를 살펴보는 것입니다. 기본적으로 플레이어를 중심으로 점이 조정되지만, 원점은 당신이 있는 방의 중심에 있게 됩니다. 물리적으로 방을 돌어다니면 HMD의 위치는 중심점에 따라 추적하고 이는 가상 세계에 반영됩니다.

간단한 예로 물리적으로 방을 돌아다닐 때, ARVR 원점은 한 자리에 있고, 카메라와 컨트롤러의 위치는 움직임에 따라 조정되는 것입니다. 가상 세상을 통해 움직이거나 컨트롤러 조작을 통한 순간이동을 구현할 때, 그 위치에 원점을 조정해야할 것입니다.

ARVRCamera는 씬에 반드시 있어야 되는 두 번째 노드로, 항상 Origin 노드의 자식으로 있어야 합니다. Godot의 표준 카메라의 하위 클래스입니다. 하지만, 위치는 매 프레임마다 HMD의 위치와 물리적 방위에 따라 자동으로 업데이트됩니다. 그리고 HMD나 실제 카메라를 통한 AR 오버레이를 렌더링하기 위한 정밀도 때문에, 대부분의 표준 카메라 속성은 무시됩니다. 사용되는 카메라의 유일한 속성은 근거리 및 원거리 평면 설정입니다. FOV, 종횡비 그리고 투영 모드 모두 무시됩니다.

주의하세요, 우리 고유의 모바일 VR 구현을 위해, 위치 추적 없이 스마트폰의 방위만 확장되어, HMD를 추적합니다. 이 구현에서 인위적으로 카메라를 1.85의 높이 (Y)에 둡니다.

결론: 씬에서 AR이나 VR 작업을 위한 최소 설정은 다음과 같아야 합니다:

../../_images/minimum_setup.png

그리고 여기까지가 시작하는데 필요한 것입니다. 분명히, 씬에 무언가를 추가해야할 것입니다, 그래야 볼거리가 있으니까요, 하지만 그 후, 게임을 선택한 폰에 내보내고 뷰어에 나타나게 하거나 멀어지게 할 수 있습니다.

고려해야 할 다른 사항

이 입문서도 알아두면 좋지만, 이를 넘어 간략하게 볼 몇 가지 사항이 있습니다.

첫 째는 단위입니다. 보통의 3D 게임에서, 단위에 대해 많이 생각할 필요는 없습니다. 모든 것들이 같은 크기에 있는 한, 손에 잡는 상자부터 빌딩 크기의 것이든 어떤 상자도 1:1:1 단위의 상자가 될 수 있습니다. AR과 VR에서는, 현실 세상에서 가상 세상이 맞춰지기 때문에 이러한 사고는 바뀝니다. 실제 세상에서 1미터 앞으로 걷는데, 가상 세상에서 1cm만 앞으로 걷는다면 문제가 일어납니다. 컨트롤러의 위치도 마찬가지입니다; 맞는 해당 위치에 컨트롤러가 나타나지 않는다면, 플레이어의 몰입감을 망가뜨릴 것입니다. 우리의 AR/VR 서버를 포함한 대부분의 VR 플랫폼은 1 단위 = 1미터로 잡습니다. 하지만 AR/VR 서버는 편의를 위한 속성을 갖고 있는데, 이는 ARVROrigin 노드에서 world scale이란 이름으로 나타나 있습니다. 예를 들어, 속성 값을 10으로 설정하면 시스템은 10 단위 = 1미터로 인지합니다.

퍼포먼스는 신중하게 고려해야 할 또다른 사항입니다. 특히 VR은 대부분의 사람들의 생각보다 게임에 많은 자원을 잡아 먹습니다. 모바일 VR의 경우, 더욱 주의해야합니다, 하지만 데스크톱 게임이라도, 세 가지 요인이 작업을 더욱 어렵게 합니다:

  • 스테레오스코픽을 렌더링합니다, 하나 짜리를 두 개로 렌더링 하는 거죠. 새로운 MultiView OpenGL 확장을 지원하는 것을 염두에 두기에, 작업 부하를 두 배로 늘리거나 파이프라인에있는 작업을 두 배로 늘리지는 않더라도, 두 눈을 위한 렌더링 이미지로 추가 작업 부하가 있습니다
  • 일반 게임은 30fps에서 정상적으로 실행되며 이상적으로는 60fps로 관리합니다. 이는 저사양과 고사양 하드웨어를 사이에서 플레이하는데 큰 격차를 줄 수 있습니다. 하지만 AR이나 VR의 HMD 애플리케이션은, 60fps가 절대적인 최솟값이므로 반드시 게임이 안정적인 90fps로 실행되어 사용자가 즉시 멀미를 느끼지 않도록 해야 합니다.
  • 높은 FOV와 관련 렌즈 왜곡 효과는 화질을 두 배로 렌더하기 위해 많은 VR 경험이 필요합니다. 네 VIVE는 각 눈마다 1080x1200의 화질을 갖고 있지만, 우리는 각 눈에 2160x2400의 결과로 렌더링합니다. 이는 대부분의 AR 애플리케이션에서 문제가 되지 않습니다.

전체적으로, 일반 3D 게임과 비교하여 GPU의 작업량은 상당히 높습니다. 작업이 파이프라인에 있는 동안, MultiView와 foveated 렌더링과 같은 것을 개선하기 위해, 이들은 모든 장치에서 지원하잔 않습니다. 이런 이유로 더 많은 아트 스타일을 사용하는 많은 VR 게임을 보게되며, 현실감을 추구하는 VR 게임에 깊게 보다보면, 아마 효과에 대해 조금 더 전통적이거나 좋은 오래된 눈속임을 사용한다는 것을 알 수 있습니다.