はじめまして。Cygames Researchでエンジニアをしている朝日田です。
2018年12月15日に開催されたDevelopers Boostにて、「スマホアプリで次世代ARを実現する~ARKit/ARCoreの活用」と題した講演を行いました。講演に参加していただいた皆様には改めて御礼申し上げます。
本講演は、今回開発したスマートフォン向けARアプリに用いた技術を抜粋して解説しました。このブログでは、講演で述べた内容を少し補足したいと思います。
発表資料は下記になります。
高い実在感をARで表現する3つのポイント
今回開発したARアプリは、スマートフォンの内蔵カメラで写した現実世界の中を、3DCGのキャラクターが動き回るというものでした。ARで高い実在感を表現するには、CGやアニメーションの質が大事なことはもちろんですが、それ以上に、いかに現実に溶け込ませるかが重要となります。
そのためには、ユーザーとキャラクターの間に存在する遮蔽物でキャラクターが隠れるように見せること(オクルージョン)で、本当にそのキャラクターが存在しているような実在感を演出します。この表現は、現実の空間をそのまま再現したCG空間を作成し、それをカメラで捉えた現実の景色と重ね合わせることで実現させることができます。
オクルージョンを実現するには、(1)自分(ユーザー)がどこにいるかを認識、(2)物体がどこにあるかを検出、(3)CGを現実に溶け込ませる、という3つの作業が必要となります。今回は、iOS/Androidに搭載されているAR機能であるARKit/ARCoreを使ってこれらを実装しました。ARKit/ARCoreを用いると、スマートフォンだけで以下のようなことができるようになります。
- モーショントラッキング
- 光源の推測
- 特徴点抽出
- 平面検出
- ImageTracking
- 空間共有
(1)自分(ユーザー)がどこにいるかを認識
まず、自分の現在位置を認識させるために、ARKit/ARCoreのモーショントラッキング機能を使用しました。これは、起動時からどれくらい動いたのかという情報を取得することにより自己位置推定を行うもので、スマートフォンが搭載するセンサーとカメラ画像から得られる情報により、現在の位置と向きを計算します。
(2)物体がどこにあるかを検出
物体がどこにあるかを検出するためには、検出したい物体にマーカーを貼り付け、そのマーカーを読み取ることで物体の位置を検出します。このマーカーは「arUcoマーカー」と呼ばれるもので、オープンソースのコンピュータビジョンライブラリである「OpenCV」を使って検出することができます。
ARKit/ARCoreのImageTrackingでも同様の動作ができるのですが、ARKit/ARCoreを使用した場合、検出の精度や実行間隔などを調整するときに、それぞれのライブラリごとに調整する必要が出てきてしまうため、今回は両方のOSで使用できるライブラリであるOpenCVを使用しました。
カメラでarUcoマーカーを撮影すると、マーカーのサイズと歪みから、カメラ位置に対するマーカーの距離と角度を算出します。この情報と、(1)の自分がどこにいるかという情報を統合し、現実空間の位置を推論してCG空間を重ねます。
次に、CG空間上でarUcoマーカーを貼った位置を指定します。これにより、現実の空間とCG空間の位置関係を正確に一致させます。この作業が必要な理由は、arUcoマーカーによって検出できるのは、あくまで「マーカーが(カメラから見て)どこにあるのか」だけで、「マーカーがCG空間内のどこに貼られているのか」まではわからないからです。今回は、一度arUcoマーカーの位置を仮に指定してCGを重ねた後、手入力で仮のマーカー位置と本来のマーカー位置とのずれを補正するという方法を用いました。
(3)CGを現実に溶け込ませる
最後は、CGの物体を現実に溶け込ませる作業です。(1)と(2)により、現在位置とそこから見える遮蔽物の位置関係を把握し、遮蔽物を含む現実空間をアプリ内に再現することがでました。あとは、カメラから見た時に遮蔽物によって物体が隠れて見えるように、その部分の描画を無効にします(これをオクルージョンカリングと呼びます)。こうすることで、キャラクターが遮蔽物の向こう側に存在しているかのように表現でき、実在感をより高めることができるようになります。
おわりに
今回はDevelopers Boostのフォローアップとして、今回講演した内容が実際にはどのように使われたのか、またこの技術が目指したコンテンツとはどのようなものだったのかについてご説明しました。
Cygamesは、ゲームに限らず最高のコンテンツを作ることをビジョンとしています。今までにない最高のコンテンツを作り上げ、最高の体験をユーザーに届けるためにはどうしたらよいか。Cygamesでは、そんなテーマを一緒に追求していけるエンジニアを募集しています。ご興味のある方は、こちらをご覧いただければと思います。