▲ 에픽게임즈 코리아 신광섭 리드 개발자

[인벤게임컨퍼런스(IGC) 발표자 소개]신광섭 리드 개발자는 에픽게임즈 코리아에서 릴레이션 리드 및 프로그래머로 재직 중이다. 이전에는 언리얼엔진 2, 3을 이용한 ‘마그나카르타’ PS2/PSP와 XBox 360 버전 개발에 참여한 바 있다.

핫한 플랫폼으로 VR과 AR을 꼽은 지도 꽤 오랜 시간이 지났다. 이중 AR은 VR에 비해서 뒤처졌다는 이야기가 다소 있었다. 하지만, 지난 WWDC에서 애플이 AR 기술을 공개했고 구글 역시 뒤질세라 지난 8월 30일 새로운 AR 기술인 ARcore를 공개했다. 이에 많은 기업이 새로운 AR 콘텐츠를 개발할 것으로 기대된다.

새로 개선된 AR 기술을 통하면, 사용자는 VR과 다르게 특별한 장비를 추가로 구매하지 않아도 AR 기술을 즐길 수 있다. 더 새로워진 에픽게임즈의 언리얼 엔진을 통한 AR 개발을 소개하기 위해 신광섭 에픽게임즈 리드 개발자가 단상에 올랐다.


■ 강연주제: AR에 대처하는 우리들의 기술

AR(Augmented Reality)은 현실 세계에 가상의 오브젝트를 합성해 같은 공간에 존재하는 것처럼 보이게 하는 기술이다. 가상의 공간에 사용자가 들어가는 VR과는 반대 개념으로 이해하면 쉽다. 지금까지 AR은 VR에 비해 기술이 뒤처지면서 관심도 떨어졌다는 이야기가 있다. 하지만, ‘포켓몬GO'의 성공과 애플이 ’WWDC 2017‘에서 AR을 위한 프레임워크, Apple ARKit을 공개하면서 다시 AR에 대한 관심이 높아졌다.


▲ WWDC 2017은 AR의 도약을 예고하는 듯 하다


애플이 ‘WWDC 2017’에서 공개한 모바일 AR 플랫폼, Apple ARKit은 아이폰6s, 혹은 A9칩 이상의 모든 iOS 디바이스에서 AR을 사용할 수 있다. 기존의 AR 기술로는 구글의 Tango와 차별화되는 점은 추가적인 카메라나 특별한 장비 없이도 AR을 사용할 수 있다는 점이다. Apple ARKit은 가을 공식 출시되는 iOS11에 포함된다. Apple ARKit의 중요한 기능으로는 World Tracking, Scene Understanding, 렌더링 기술이다.

첫 번째 World Tracking 기술은 실제 세상에서의 물리적인 위치인 디바이스 위치와 오리엔테이션을 결정한다. ARKit이 카메라 이미지와 디바이스 움직임을 이용해 현재 위치와 오리엔테이션을 제공하는데, 기존에는 디바이스 내 중력 센서와 자이로코프 센서를 이용해 확인했다면 ARKit은 카메라를 통해 습득한 이미지를 계산한다. 그리고 디바이스가 이동함에 따라서 캡처된 이미지에 특정 포인트, 물체의 모서리나 색이 바뀌는 특정 부분을 인식해 3D 공간의 피쳐 포인트(feature point)로 인식한다.

World Tracking은 카메라를 통해 얻은 이미지가 프로그래밍 상 세션에 제공되지 않으면 추적이 불가능하다는 단점이 있다. 또한, 충분한 텍스쳐 환경이 마련돼야 하는데, 충분한 비주얼적 복잡도가 필요하다. 즉, 하얀 벽이나 충분한 빛이 없는 곳에서의 tracking은 제한적이다. 마지막으로 많은 물리 오브젝트가 움직이는 장면은 제대로 추적 하기 어렵다.

World Tracking은 입력받은 이미지의 품질에 따라서 Not Available, Normal, Limited로 구분하게 된다. 따라서 세션이 중단되는 경우는 정보를 충분히 입력받지 못할 때 일어난다. 카메라 입력이 불가능한 경우, 충분한 정보를 받지 못해 추적이 불가능한 상황일 때, 블러 효과를 주는 처리가 필요하다.

두 번째로 Scene Understanding 물리적인 환경을 이해해서 가상의 오브젝트를 놓을 수 있도록 하는 것이다. 이를 위해서는 세 가지 조건이 필요한데, 먼저 Plane detection을 통해 가상의 오브젝트를 놓기 위해서는 물리적인 표면을 찾는 것이 필요하다. 다음으로 히트 테스팅(Hit testing: 충돌 실험)을 통해 오브젝트를 배치할 3차원 좌표 공간을 찾는 과정이 행해진다. 마지막으로 이루어지는 Light estimation은 가상의 오브젝트를 더 사실적으로 표현하기 위해 사용된다.

Plane detection은 계산을 통해 중력에 따른 수평 평면을 제공한다. 테이블이나 바닥 등이 이에 해당한다. 계산은 카메라를 통해 입력받은 여러 프레임 정보를 종합해 찾아내는 데, 디바이스의 이동에 따라 들어온 정보를 통해 평면의 확장을 제공한다. 평면을 찾아내면 ARPlaneAnchor을 생성하고 실제 세상의 transform 정보를 담는다.

히트 테스팅은 카메라를 통해 입력된 화면상의 이미지를 터치해, 실제 세상의 오브젝트와의 충돌 정보를 제공한다. 충돌된 정보는 거리에 따라 정렬해 제공하는 데, Existing plane using extent, Existing plane, Estimated plane, 피쳐 포인트로 구분된다.


가장 많이 쓰이는 Existing plane using extent는 테이블이 하나만 있는 경우처럼 특정 평면에만 히트 테스팅을 하는 경우다. Existing plane은 가상의 오브젝트로 의자를 생성하고서 옮기고 싶을 때, 의자가 이동할 곳은 당연히 평면일 거라 가정한다. 가상의 가구를 옮길 때 Existing plane으로 얻은 값을 이용해서 이동한다.


Estimated plane은 구겨진 이불 같이 정확한 평면 값을 못 찾았을 경우에 사용한다. 하지만 구겨진 포인트의 평균값이 근사치로 평면 값일 경우에는 계산해서 평면을 구현한다. Feature point는 평면 값을 계산하지 못하는 상황에서 특정 피쳐 포인트 밑에 평면을 구현한다.

Light estimation은 캡처된 이미지의 환경과 가상의 오브젝트를 조금 더 어울리게 하는 기능이다. 예로 환경은 밝은데 오브젝트는 어둡거나, 반대로 환경은 어두운데 오브젝트는 밝을 경우 사용자는 어색하게 받아들인다. 이때 Light estimation의 기능으로 환경의 밝기를 계산해 오브젝트의 자연스러운 빛을 도출한다.

Apple ARKit의 마지막 중요한 기능인 Redering은 SceneKit과 SpriteKit을 지원한다. Metal을 이용한 Custom 렌더링 지원으로는 △카메라 배경 이미지 그리기 △Virtual Camera 업데이트 △lighting 업데이트 △가상 오브젝트 transform 업데이트가 있다.


그렇다면 구글은?

8월 30일 이전까지 구글은 자사에서 만든 컴퓨터 비전을 사용해 디바이스가 실제 세상에서 자신의 상대적 위치를 이해할 수 있도록 하는 AR 플랫폼, Tango를 사용했다. Tango의 원리는 마치 사람이 눈을 통해서 실내 어느 위치에 있는지, 바닥, 벽, 오브젝트는 어디에 있는지 찾는 것과 유사하다. AR을 가능케 하는 Tango의 중요 기능으로는 Motion Tracking, Area Learning, Depth Perception 세 가지다.

Tango의 Motion Tracking은 앞서 살펴본 Apple ARKit의 World Tracking과 유사한 점이 많지만, 차이점이 있다면, Tango 전용 디바이스인 Fish-eye 카메라로 얻은 이미지 정보와 디바이스의 모션 데이터를 이용해 추적 한다는 점이다.

제한으로는 디바이스가 주변의 실제 영역을 이해하는 기능을 제공하지 않는다. 또한 전에 했던 세션을 기억하지 못한다. 새로운 Motion Tracking 세션을 시작할 때마다 추적은 시작 지점에 상대적인 위치를 제공한다. 마지막으로 오랜 시간 동안 긴 거리를 이동하는 경우에는 작은 오차들이 모아져서 ‘이동’ 현상 에러가 발생할 수 있다.

특정 공간에 대한 정보를 저장하고 ‘이동’ 문제를 해결하기 위해 구글은 Area Learning 기능을 내놓았다. Area Learning은 모서리나 코너 등 특별한 모양들을 기억하고 나중에 그것을 기반으로 그 지역을 다시 인식할 수 있도록 지원한다. 이를 위해 비주얼 오브젝트의 요소를 수학 기술(description)을 통해 디바이스에서 검색 가능한 index로 저장하고, 이를 통해 디바이스에서 현재 보고 있는 지역을 빠르게 찾을 수 있도록 지원한다.

Area Learning으로 학습한 정보는 ADF(Area Description File)로 저장된다. ADF 파일을 로딩하는 것으로 전에 학습한 디바이스의 좌표 정보를 가져와, 그 위치에서 배치했던 게임이나 앱 관련 콘텐츠를 같은 위치에 빠르게 로딩할 수 있다.

마지막으로 Depth Perception은 실제 세상에서의 오브젝트 간의 거리를 가늠할 수 있는 기능이다. 이것을 통해 디바이스는 게임에서 플레이어가 벽이나 특정 오브젝트에 가까이 가는지를 인식할 수 있다. Depth 데이터는 컬러 이미지와 함께 사용해 텍스쳐화나 메쉬를 생성할 수 있다.

일반적으로 Tango는 다른 AR 플랫폼보다 우수한 기능을 제공하지만, Fish-eye와 같은 추가 디바이스를 요구하기 때문에 대중성이 떨어진다.

▲ 탱고를 지원하는 모바일이 레노버 팹2 프로 뿐이라는 것도 문제였다


새롭게 나온 Google ARCore?

바로 어제(8월 30일), 구글은 새로운 AR 플랫폼 ARCore를 공개했다. 앞서 소개한 Tango의 최적화 버전으로 이해하면 쉬운데, Fish-eye와 같은 카메라를 추가하지 않고 기존 안드로이드 디바이스에 대응할 수 있다. 현재, 구글 픽셀폰과 갤럭시s8을 지원하며 출시 시점에는 더 많은 기존의 안드로이드 디바이스를 지원할 예정이다.

Google ARCore의 중요 기능으로는 Motion Tracking, Environmental Understanding, Light Estimation 등 세 가지다. Motion Tracking과 Light Estimation은 Apple ARKit의 World Tracking, 렌더링과 유사하다.

Environmental Understanding은 카메라를 통해 들어온 이미지 정보를 기반으로 피쳐 포인트와 plane 등을 찾아서 실제 세상의 환경을 알 수 있도록 해주는 기능이다. 피쳐 포인트 정보를 통해 디바이스 이동이 있더라도 상대적인 위치를 파악할 수 있다. 순서는 먼저 테이블이나 책상 같은 평면에 놓인 피쳐 포인트 정보 묶음을 찾고, 그것을 통해서 plane을 찾아낸다. 이렇게 얻은 plane 정보로 가상의 오브젝트 배치가 가능하다.

▲ Google ARCore는 어떤 변화를 가져올까?


본격, 언리얼 엔진4를 이용해 Apple ARKit 시작하기

'WWDC 2017'에서 ARKit을 공개한 당일부터 지원한다. 다만, 언리얼 엔진 4.17 버전의 ARKit 플러그인의 실험기능으로 지원한다. 아직 정식 iOS 11이 출시되지 않았기 때문이다. 실험 기능을 체험해보기 위해서는 애플 개발자 계정, iOS 11 beta iPhone/iPad가 필요하다 이 준비는 아이폰/아이패드에서 애플 개발자 페이지로 들어가 인증서 설치로 다운 받는 것을 권한다. 그리고 Xcode 9 beta 버전을 설치한다.

먼저, 언리얼 엔진4가 Xcode 9 beta 버전을 사용하도록 설정해야 한다. 터미널에서 아래 명령어를 입력해 실행한다.

sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer

이후, 언리얼 엔진 런처에서 4.17 최신 버전을 다운로드 해 새로운 빈 프로젝트를 생성한다. 프로젝트 세팅은 ‘iOS’ 설정이 필요하고, orientation은 Right Orientation만 선택한다. 그리고 최신 Metal 버전을 선택한다.

다음으로 Plist에 카메라 관련 권한 요청을 추가한다. 코드는 다음과 같다.



코드 이후에는 ARKit 플러그인을 활성화 하고 에디터를 재실행한다. 이때, Metal 관련 에러 메시지는 무시해도 무방하다. 재실행을 마쳤다면 새로운 Pawn 블루프린트를 생성하고 AppleARKitCamera Component를 추가한다. 생성한 GameMode에 Default Pawn Class를 새로 생성한 Pawn으로 설정한다. 그리고 프로젝트의 기본 GameMode를 새로 생성한 GameMode로 설정한다.

위의 과정을 완료했다면 ‘실행’을 통해서 iOS 디바이스에서 설치 테스트를 진행한다.

이후, AppleARKitCamera Texture를 만든다. 배경으로 사용할 새로운 Material을 생성하고, AppleARKitCameraTexture를 연결한다. 배경으로 사용되어 카메라 이미지를 표현할 구체(Sphere) 메쉬를 맵에 추가한다. 그리고 구체에 AppleARKitCameraTextureMaterial을 설정한다.

위의 과정이 잘 마쳤는지 확인하기 위해 ‘실행’을 통해 iOS 디바이스에서 설치 테스트를 한다.

그리고 3D 오브젝트 배치를 위해 ‘Hit Test at Screen Position’ 함수를 사용한다. 함수는 언리얼 엔진에서 자체적으로 지원한다. 맵 블루프린트에서 Pawn을 가져와 추가한 ARKitCameraComponent를 사용한다.

그리고 마찬가지로 ‘실행’을 눌러 최종 버전 설치 테스트를 진행한다.


어제 나온 Google ARCore를 사용하고 싶다면?

Google ARCore 발표와 함께 바로 테스트할 수 있다. Google ARCore 페이지(바로 가기)에서 직접 제공하는 Unreal Engine ARCore 페이지를 통해 예제를 받을 수 있다.

실행하면, ARCore plugin이 포함되어 활성화 되어 있는 것을 확인할 수 있다. ‘프로젝트 세팅’에 GoogleARCore 기능이 설정되어 있고 기본적으로 활성화 되어 있다. 테스트를 위해 새로운 라벨을 추가하고 맵에 SkyLight를 배치, Source Type과 Cubemap을 설정한다.

생성한 GameMode에 Default Pawn Class를 새로 생성한 Pawn으로 설정한다. 그리고 프로젝트의 기본 GameMode를 새로 생성한 GameMode로 설정한다. 이후, ARCore가 설치된 디바이스를 연결한 후 ‘실행’으로 설치 및 테스트를 진행한다.

테스트를 마쳤다면, Google ARCore Point Cloud Renderer Component 사용을 위한 새로운 블루프린트 액터를 생성한다. Line Trace Single on Plane 노드를 통해서 Plane을 찾는다. 그리고 블루프린트 액터를 맵에 배치하고, Player 입력을 받도록 처리한다. 이후 ‘실행’을 툴러 설치 및 테스트를 확인한다.

이상의 과정은 코딩 없이 가능하며 갤럭시s8로 바로 시험 제작할 수 있다.


■ Q&A

ADF에서 껐다 켜도 가능하다고 했는데, 실제 월드 값이 아니어서 불가능하지 않나?

실제 오브젝트의 포인트로 확인한다. 3D 오브젝트의 지역이 아닌 포인트(모서리)의 값을 저장하는 것이다. 책상을 예로 들면, 책상의 위치가 아닌 이미지를 저장해서 전과 같은지 확인한다.


지금까지 언리얼 엔진은 안드로이드, iOS 인터페이스가 다르게 구현되어 있다. 개발자 입장으로서 불편한데 개선할 생각은 없는지?

일단, ARCore가 늦게 나와서 그렇다. 말한 대로 인터페이스는 동일하게 하는 것으로 진행 중이다. 정식 출시 때는 더 편하게 사용할 수 있을 것이다.


AR 개발을 지금 배우는 것도 좋은가?

현재, 시장에 AR 콘텐츠 경쟁은 다른 플랫폼에 비해 매우 적다. 언리얼을 통해 콘텐츠 개발을 시작한다면 빠르게 앞서나갈 수 있을 것이다.