##壁の向こうの異世界
8時間で終わらなかったので追加作業
— 1pp0 (@1pp0qq1) June 23, 2019
ARFoundationとステンシルバッファ何となく理解した #hachitai pic.twitter.com/9mTfRCuDJQ
##はじめに
本記事はUnityのARFoundationを使用して、現実空間で認識された平面越しに異世界(AR空間)を表示する仕組みの備忘録になります。
現実空間に空いた穴越しに別の世界が見えたり、その中に入り込んだりできるAR表現はポータル表現と呼ばれています。
ポータルの実現方法としては、どこでもドアのようなアーチ型のオブジェクトを現実とAR空間の境界にするものや、認識した画像マーカーの奥にAR空間を表示するものなどがあります。
参考:UnityとARKitで異世界への扉(ポータル)を作る方法
本記事で紹介するのは、あらかじめ用意した画像マーカーなどではなく、認識された平面領域全てを異世界を覗くポータルにする方法になります。
要素技術は、ARFoundationによる平面認識と、ステンシルバッファを用いた描画処理ですが、今回はARFoundationの導入から平面認識まで実装し、最後にポータル化の前段階として現実空間にAR空間を重畳して表示する所まで説明します。
平面の認識はUnity-ARKit-Pluginを使ったことはありましたが、ARFoundationは今回が初めての利用でしたのでインストールから説明していきます。ARKit3の機能がARFoundationで利用できるようになっている事もあり、今後はARFoundationを使っていくのが良さそうです。
##準備
###環境
・Unity 2019.1.5f1
・ARFoundation 2.1.3
・ARKit XR Plugin 2.1.1
・Xcode 10.3
・iOS 12.3.1 (iPnone7)
###ARFoundationの導入
Unity-ARKit-PluginはAssetStoreないしはbitbucketからダウンロードして導入していましたが、ARFoundationはUnityのPackage Managerから追加します。
- Unityで新規プロジェクトを作成
-
Window -> Package Manager
からPackagesウィンドウを開く
- 「ar」で検索し、
AR Foundation
及びARKit XR Plugin
(Androidの場合はARKit Core Plugin
)をインストール
以上でARFoundationの導入は完了です!
実装
平面領域の可視化
それではARFoundationで現実空間の平面領域を認識し可視化していきます。
単に可視化するだけならコンポーネントの追加だけで良いため、非常に簡単に実現することができます。
- MainSceneを作成してMain Cameraを削除
- Hierarchyを右クリックしてAR Session Origine及びAR Sessoinを作成
以上で平面の認識と可視化は完了です。手順は下記レポートを参考にさせていただきました。
参考:【VR/ARイベント】「Unity AR Foundation」講座の参加レポート
一旦ここまででビルドして動作を確認しましょう。
###ビルド設定
Edit > Project Settings > Player > iOS > Other Settings
のRequires ARKit support
にチェックを入れると、カメラ使用のためのCamera Usage Description
に自動で文言が入力されます。
また、ARKitはiOS11からサポートのため、Target minimum iOS Version
を11.0
以降にします。
これでビルドしたところ下記のエラーが出たためArchitecture
をUniversal
からARM64
に変更しました。
BuildFailedException: ARKit XR Plugin only supports the ARM64 architecture. See Player Settings > Other Settings > Architecture.
ビルドして辺りを見渡すと、下の動画のように認識された平面領域が表示されます!
ここまでノーコーディングで実装することができるため、ARFoundationは非常に使い勝手が良いと思いました。
平面認識のAR Plane Manager
の他にも、特徴点を表示するAR Point Cloud Manager
や、画像トラッキングを行うAR Tracked Image Manager
などもあるので、用途に応じて試してみてください。
異世界の作成と表示
ステンシルバッファを用いて平面越しにAR空間を表示する前段階として、現実空間にAR空間を重畳して表示します。
冒頭の動画ではアセットストアのNature Starter Kit 2のDemoシーンのオブジェクトを使用しました。
下記の手順では、現実空間のみを表示するカメラと、AR空間のみを表示するカメラをそれぞれ用意し、二つの映像を重ねて表示する事で、現実空間にAR空間を重畳します。
- 空のGameObject ARWorldParentを作成し、平面越しに表示したいオブジェクトをARWorldParentの子として配置してAR空間を作成
- AR空間用のレイヤーARWorldを追加
- ARWorldParentのレイヤーを追加したARWorldに変更
- カメラの追加と設定
AR Cameraの子として新しくカメラWolrd Cameraを追加し、Clear FlagsをDepth Only、Culling MaskをARWorldに変更します。
これで1で作成したAR空間のオブジェクトはAR Cameraには映らず、World Cameraにのみ描画されるようになるため、AR Cameraの映像の上にWolrd Cameraの映像を重畳する事で、現実空間にAR空間を重ねて表示する事ができます。
また、AR Cameraにはカメラ(スマートフォン)の6DOF(並進・回転)姿勢が自動で反映されます。Wolrd Cameraは親であるAR Cameraの姿勢に追従するため、下の動画のようにスマートフォンの移動に伴って、AR空間内のカメラも移動します。
この状態では最初からAR空間全体が現実空間に表示されているため、異世界を覗くようなポータル表現にはまだなっていません。
次回はステンシルバッファを用いてARFoundationで認識した平面の領域のみAR空間が表示されるよう、平面領域をポータル化する方法について説明します!
「Unityで認識した平面をポータル化して異世界を覗く【ステンシルバッファ編】」をお待ちください!