ARKit2.0からは2次元の画像マーカーだけでなく、3次元の物体(例えばぬいぐるみだったり、玩具だったり)をマーカーにすることが出来るようになりました。ただ、現状ではオブジェクトトラッキングはできないため、3Dマーカーは動かないことが前提の使い方になります。
物体をマーカーにする流れ
- マーカーにしたい物体を360度撮影して、物体のもつ特徴点データを検出します。
- 作成した特徴点データをUnityにインポートし、ARReferenceObjectに登録します。
- 作成したAssetを、ARReferenceObjectsSetAssetに登録します。
- 作成したSetAssetをAR Config Optionsに登録します。
このように書くと、ものすごく複雑そうに見えますが、やっていることは2次元マーカーを登録したときと同じことをしています。
一点違うのが❶の特徴点データを検出する部分です。ここはプログラマが手作業でやる必要があります。まずはその方法から見ていきましょう。
特徴点データを取り出す
3Dの特徴点データを取り出すには専用のアプリが用意されています。といっても、自分でビルドする必要があります(笑)
まずは次のサイトからARKit Scannerのプロジェクトをダウンロードしてください。
ダウンロードできたらビルドして、アプリを起動します。起動したらまずはマーカーにしたい物体を囲むように黄色い枠を広げます。枠のサイズはドラッグやピンチで変更できます。
次に物体を360度(といっても底面はありませんが)から撮影します。うまく撮影できると、画面上のScanのパーセンテージが上昇し、ボックスの表面が黄色く変化します。
すべての面が撮影できたら「Share」ボタンを押して、特徴点データをPCに転送します(転送にはAirDropが便利!)。ファイル名は「Scan-xxxx.arobject」みたいになっていると思います。
ここでは名前をyadon.arobjectに変更しておきました。
Unityに特徴点データをインポート
Unityのプロジェクトを作成し、ARKit Pluginをインポートしたら、Unity ARKit Sceneを開いてください。詳しい方法は次の記事で紹介しています。
先程転送した、特徴点データをプロジェクトウィンドウにドラッグ&ドロップして追加しておきます。
ARReferenceObjectAssetを作成する
追加できたらプロジェクトウインドウで右クリックして、「Create」→「UnityARKitPlugin」→「ARReferenceObjectAsset」 を選択します。

作成したARReferenceObjectAssetのファイル名は「yadonObject」にしました。
続いて今作成したyadonObjectに3Dモデルの特徴点情報を登録します。インスペクタのReference Object欄に特徴点データ「yadon.arobject」をドラッグ&ドロップします。また、Object Nameはyadonにしておきます。

ARReferenceObjectsSetAssetに追加する
作成したARReferenceObjectAssetをARReferenceObjectsSetAssetに登録します。名前が似ていてややこしいですね。。ARReferenceObjectAssetは本、ARReferenceObjectsSetAssetはARReferenceObjectAssetを収める本棚とイメージすると理解しやすいかもしれません。
ARReferenceObjectAsset | 本 |
ARReferenceObjectsSetAsset | 本棚 |
プロジェクトウインドウで右クリックして、「Create」→「UnityARKitPlugin」→「ARReferenceObjectsSetAsset」 を選択してください。
作成したARReferenceObjectsSetAssetのファイル名はObjectsSetにしました。
いま作成したObjectsSetのインスペクタに上で作成したyadonObjectを登録します。Resource Group Nameはtest、Reference Object AssetsのSizeを「1」にして、Element 0の欄にyadonObjectをドラッグ&ドロップします。
このReference Object Assetsに登録したObjectAssetが立体マーカーとして検出される対象になります。
ARReferenceObjectsSetAssetを登録する
上のステップで作成したARReferenceObjectsSetAssetをシステムに登録します。ヒエラルキーウインドウでARCameraManagerを選択します。インスペクタのUnityARCameraManagerのObject Trackingの項目を見てください。Detection Objectの欄に先程のObjectsSetをドラッグ&ドロップします。
これでオブジェクトトラッキングが行われるようになります。ただ、このままではARマーカーを見つけても何も起こりません。マーカーを見つけたときには3Dモデルを表示するようにしましょう。

画像と表示するモデルを関連づける
ARマーカーを映したときに、マーカー上に表示する3Dモデルを決めます。今回は「やぁん」の3Dモデルをを使用しています(以降のスクショと少し齟齬があります・・・)

ヒエラルキーウインドウで「Create」→「Create Empty」で空のゲームオブジェクトを作ります。次に作成したオブジェクトを選択した状態で「Add Component」→「Generate Object Anchor」スクリプトをアタッチします。

スクリプトのReferenceObjectに「yadonObject」、Prefab To Generateに生成したいPrefabをそれぞれドラッグ&ドロップしてください。

ターゲットの画像マーカーが見つかった場合は、Generate Object Anchorスクリプトの中のAddObjectAnchorが呼び出されます。また、画像マーカーの位置が更新された場合にはUpdateObjectAnchorが呼び出されます。
RemoveObjectAnchorもありますが、これは画像マーカーが画面外に出たときに呼び出されるわけではありません。明示的に次のスクリプトでAnchorを破棄したときにのみ呼び出されます。
UnityARSessionNativeInterface.GetARSessionNativeInterface().RemoveUserAnchor( arImageAnchor.identifire );
オブジェクトトラッキングの確認
これでUnityとARKitを使って画像トラッキングを行う準備は完了です。実際にビルドして正しく動くか確認してみてください。

正しく設定できていれば、ARマーカーを映すと指定した3Dモデルが表示されます。
タッチすると喋るぬいぐるみ(ヤドン)。#ヤドン #ARKit #AR #ぬいぐるみ pic.twitter.com/rbYHpauNkC
— 北村愛実 (@tasonco_company) 2019年6月25日