Search

AR Foundation으로 새로 태어난 건조기 몬스터

date
2019/10/09
tags
AR
ARFoundation
유니티3D
URP
아들과 2인개발
4 more properties
아들과 2인 개발 모음
Search
얼마 전에 트위터에 AR 몬스터 동영상을 올렸습니다. AD님에게 “우리도 카메라로 책상 찍으면 그 안에서 몬스터 돌아다니고 그런 거 만들어 볼까?”라고 제안을 했더니 좋다고 합니다. 그렇게 AR로의 여행이 시작되었고, 이것저것 헤맨 끝에 만들어진 동영상입니다. 이번 포스팅에서는 Universal RP 환경에서 AR Foundation을 사용해서 기본적인 AR 기능을 구현하면서 알게 된 내용을 정리해보겠습니다.

AR Foundation

안드로이드와 iOS에서는 개발자의 AR 앱 개발을 지원하기 위해서 각각 AR Core와 AR Kit을 제공합니다. 각각의 기능과 사용법이 다르므로, 유니티에서는 AR Foundation을 제공하여 같은 코드 기반으로 안드로이드와 iOS에서 동작하는 AR 게임을 만들 수 있게 해주었습니다. 물론 어느 한쪽에서만 제공하는 기능은 해당 OS에서만 사용할 수 있습니다.
아직 개발이 진행 중인 상태라서 일부 지원하지 않는 기능도 있고, 유니티 에디터와 모바일 디바이스를 연결해서 개발을 할 수 있는 ARKit Remote 같은 기능도 새로 개발하는 중이라 AR Foundation에서는 사용할 수가 없습니다. (이곳이곳에서 확인했습니다. 이 링크를 찾는데도 한참 걸렸어요) 그래서, 매번 기능을 수정할 때마다 폰에 빌드를 올려서 테스트해야 해서 개발이 매우 비효율적입니다.
또, 도움말이 매우 부족해서 AR Foundation 샘플이 없으면 뭘 어떻게 해야 하는지 알기 어려울 정도입니다. 샘플을 보시는 것이 가장 빠른 방법입니다! 샘플은 깃허브에 있습니다.
처음에 봐야할 씬은 SimpleAR 씬입니다. 바닥과 벽을 감지하고, 화면을 터치하면 그 위에 게임오브젝트를 생성하는 가장 기본적인 샘플입니다.

렌더링

AR을 시작하면서 제일 궁금했던 부분은 라이팅 정보와 리플렉션용 큐브맵을 얻는 방법, 그리고 그림자였습니다.
우선 메인 라이팅의 방향을 얻는 방법은 없는 것 같습니다. AR Kit에서 얼굴 인식을 사용하는 경우에는 인식된 얼굴을 프로브로 사용해서 라이팅의 방향을 얻어주는 기능이 있지만, 그 외에는 방법을 찾을 수가 없었습니다.
라이팅의 밝기나 색상 등의 정보는 AR Foundation에서 제공합니다. 샘플의 LightEstimation 씬을 열어보시면 라이팅 값을 얻어서 메인 라이트에 적용하는 코드를 볼 수 있습니다. 주변의 라이트를 정확하게 표현한다기보다는 방에 불을 켜고 껐을 때 이질감이 없을 정도로 동작합니다.
리플렉션 프로브를 생성해주는 기능도 있습니다. EnvironmentProbes 씬을 참고하시면 됩니다. 이 씬을 빌드해서 실행해보면 디버깅용 쇠구슬들이 주변을 비추고 있는 것을 볼 수 있습니다.
그림자는 투명한 바닥 오브젝트의 셰이더를 잘 구현하면 됩니다.
카메라에서 얻어진 텍스쳐가 그려진 상태에서 투명한 바닥 오브젝트를 그리면서 그림자 부분을 어둡게 그려주는 방식입니다. LWRP용 셰이더가 있어서 Universal RP에서 동작할 수 있게 살짝 바꿔서 gist에 올려두었습니다.
마지막으로 Universal RP를 사용할 때는 카메라의 이미지를 얻어오기 위해서 렌더 피처를 추가해줘야 합니다. 자세한 내용은 여기를 참고하세요. 렌더 피처에 대해서는 아래 포스트를 참고하시면 됩니다

마치며..

이번 포스팅은 여기까지입니다. 다음 번 스펙을 구현하러 가야 해서 제가 헤맸던 것들만 간단히 정리해봤습니다. 마지막으로, 여러가지 노력 끝에 탄생한 AR 건조기 몬스터를 보면서 마치겠습니다.

Two More Things…

서두르다가 빠트린 내용이 있어서 추가합니다.
하나는 카메라 이미지가 실제보다 밝게 나오는 이슈입니다. 리니어 컬러 스페이스를 사용하는 것이 영향을 줍니다. 아마도 카메라 이미지를 가져오는 렌더 피처 구현에서 이미 리니어 스페이스인 텍스쳐를 다시 한 번 감마 -> 리니어 변환을 하는 것 같지만, 자세히 보지는 못했습니다. 조만간 유니티에서 패치해주겠지요.
나머지 하나는 iOS용 빌드를 할 때 iOS 빌드 설정에서 Symlink Unity libraries를 선택해주면 안됩니다. 자세한 내용은 여기를 참고해주세요. 또, 다른 링크 에러를 해결하기 위해서 Advertisement 패키지를 최신 버전으로 업그레이드했는데, 관련 링크를 다시 찾으려고 하니 안보이네요