Edited at

Unityで認識した平面をポータル化して異世界を覗く【ARFoundation編】


壁の向こうの異世界


はじめに

本記事は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から追加します。


  1. Unityで新規プロジェクトを作成

  2. Window -> Package ManagerからPackagesウィンドウを開く

    package manager


  3. 「ar」で検索し、AR Foundation及びARKit XR Plugin(Androidの場合はARKit Core Plugin)をインストール

    ar


以上でARFoundationの導入は完了です!


実装


平面領域の可視化

それではARFoundationで現実空間の平面領域を認識し可視化していきます。

単に可視化するだけならコンポーネントの追加だけで良いため、非常に簡単に実現することができます。



  1. MainSceneを作成してMain Cameraを削除

  2. Hierarchyを右クリックしてAR Session Origine及びAR Sessoinを作成
    ar session

  3. 同様にAR Dafault Planeを作成し、Prefab化してHierarchyから削除
    AR Dafault Plane


  4. AR Session OrigineにAdd ComponentからAR Plane Managerを追加
    AR Plane Manager


  5. AR Plane ManagerPlanePrefabにPrefab化したAR Dafault Planeをアタッチ


  6. DetectionModeEverytingにして水平面及び垂直面の両方を検出
    AR Dafault Plane

以上で平面の認識と可視化は完了です。手順は下記レポートを参考にさせていただきました。

参考:【VR/ARイベント】「Unity AR Foundation」講座の参加レポート

一旦ここまででビルドして動作を確認しましょう。


ビルド設定

Edit > Project Settings > Player > iOS > Other SettingsRequires ARKit supportにチェックを入れると、カメラ使用のためのCamera Usage Descriptionに自動で文言が入力されます。

また、ARKitはiOS11からサポートのため、Target minimum iOS Version11.0以降にします。

これでビルドしたところ下記のエラーが出たためArchitectureUniversalからARM64に変更しました。

BuildFailedException: ARKit XR Plugin only supports the ARM64 architecture. See Player Settings > Other Settings > Architecture.

最終的な設定は下記の通りです。

Architecture

ビルドして辺りを見渡すと、下の動画のように認識された平面領域が表示されます!

default.gif

ここまでノーコーディングで実装することができるため、ARFoundationは非常に使い勝手が良いと思いました。

平面認識のAR Plane Managerの他にも、特徴点を表示するAR Point Cloud Managerや、画像トラッキングを行うAR Tracked Image Managerなどもあるので、用途に応じて試してみてください。


異世界の作成と表示

ステンシルバッファを用いて平面越しにAR空間を表示する前段階として、現実空間にAR空間を重畳して表示します。

冒頭の動画ではアセットストアのNature Starter Kit 2のDemoシーンのオブジェクトを使用しました。

下記の手順では、現実空間のみを表示するカメラと、AR空間のみを表示するカメラをそれぞれ用意し、二つの映像を重ねて表示する事で、現実空間にAR空間を重畳します。


  1. 空のGameObject ARWorldParentを作成し、平面越しに表示したいオブジェクトをARWorldParentの子として配置してAR空間を作成

    ar world parent


  2. AR空間用のレイヤーARWorldを追加

    layer


  3. ARWorldParentのレイヤーを追加したARWorldに変更

    スクリーンショット 2019-09-01 18.07.43.png

    変更時に下記のようなダイアログが表示されるので、Yesを選択してARWorldParent以下の全てのオブジェクトのレイヤーもARWorldに変更します。

    alert


  4. カメラの追加と設定

    AR Cameraの子として新しくカメラWolrd Cameraを追加し、Clear FlagsDepth OnlyCulling MaskARWorldに変更します。

    スクリーンショット 2019-09-01 18.27.02.png

    また、AR CameraCulling Maskは逆にARWorldを外します。

    AR Camera


これで1で作成したAR空間のオブジェクトはAR Cameraには映らず、World Cameraにのみ描画されるようになるため、AR Cameraの映像の上にWolrd Cameraの映像を重畳する事で、現実空間にAR空間を重ねて表示する事ができます。

また、AR Cameraにはカメラ(スマートフォン)の6DOF(並進・回転)姿勢が自動で反映されます。Wolrd Cameraは親であるAR Cameraの姿勢に追従するため、下の動画のようにスマートフォンの移動に伴って、AR空間内のカメラも移動します。

move.gif

この状態では最初からAR空間全体が現実空間に表示されているため、異世界を覗くようなポータル表現にはまだなっていません。

次回はステンシルバッファを用いてARFoundationで認識した平面の領域のみAR空間が表示されるよう、平面領域をポータル化する方法について説明します!

「Unityで認識した平面をポータル化して異世界を覗く【ステンシルバッファ編】」をお待ちください!