おもちゃラボ

Unityで遊びを作ってます

【ARKit】3Dオブジェクトをマーカーにする

ARKit2.0からは2次元の画像マーカーだけでなく、3次元の物体(例えばぬいぐるみだったり、玩具だったり)をマーカーにすることが出来るようになりました。ただ、現状ではオブジェクトトラッキングはできないため、3Dマーカーは動かないことが前提の使い方になります。

f:id:nn_hokuson:20190625191641j:plain

物体をマーカーにする流れ

  1. マーカーにしたい物体を360度撮影して、物体のもつ特徴点データを検出します。
  2. 作成した特徴点データをUnityにインポートし、ARReferenceObjectに登録します。
  3. 作成したAssetを、ARReferenceObjectsSetAssetに登録します。
  4. 作成したSetAssetをAR Config Optionsに登録します。

f:id:nn_hokuson:20190616223701j:plain:w500

このように書くと、ものすごく複雑そうに見えますが、やっていることは2次元マーカーを登録したときと同じことをしています。

nn-hokuson.hatenablog.com

一点違うのが❶の特徴点データを検出する部分です。ここはプログラマが手作業でやる必要があります。まずはその方法から見ていきましょう。

特徴点データを取り出す

3Dの特徴点データを取り出すには専用のアプリが用意されています。といっても、自分でビルドする必要があります(笑)

まずは次のサイトからARKit Scannerのプロジェクトをダウンロードしてください。

developer.apple.com

ダウンロードできたらビルドして、アプリを起動します。起動したらまずはマーカーにしたい物体を囲むように黄色い枠を広げます。枠のサイズはドラッグやピンチで変更できます。

f:id:nn_hokuson:20190616222022j:plain:w250

次に物体を360度(といっても底面はありませんが)から撮影します。うまく撮影できると、画面上のScanのパーセンテージが上昇し、ボックスの表面が黄色く変化します。

f:id:nn_hokuson:20190616222122j:plain:w250 f:id:nn_hokuson:20190616222416j:plain:w250

すべての面が撮影できたら「Share」ボタンを押して、特徴点データをPCに転送します(転送にはAirDropが便利!)。ファイル名は「Scan-xxxx.arobject」みたいになっていると思います。

f:id:nn_hokuson:20190616222529j:plain:w250

ここでは名前をyadon.arobjectに変更しておきました。

Unityに特徴点データをインポート

Unityのプロジェクトを作成し、ARKit Pluginをインポートしたら、Unity ARKit Sceneを開いてください。詳しい方法は次の記事で紹介しています。

nn-hokuson.hatenablog.com

先程転送した、特徴点データをプロジェクトウィンドウにドラッグ&ドロップして追加しておきます。

f:id:nn_hokuson:20190621222854j:plain

ARReferenceObjectAssetを作成する

追加できたらプロジェクトウインドウで右クリックして、「Create」→「UnityARKitPlugin」→「ARReferenceObjectAsset」 を選択します。

f:id:nn_hokuson:20190621222949p:plain:w400

作成したARReferenceObjectAssetのファイル名は「yadonObject」にしました。

f:id:nn_hokuson:20190621223045p:plain:w300

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

f:id:nn_hokuson:20190621223304j:plain:w600

ARReferenceObjectsSetAssetに追加する

作成したARReferenceObjectAssetをARReferenceObjectsSetAssetに登録します。名前が似ていてややこしいですね。。ARReferenceObjectAssetは本、ARReferenceObjectsSetAssetはARReferenceObjectAssetを収める本棚とイメージすると理解しやすいかもしれません。

ARReferenceObjectAsset
ARReferenceObjectsSetAsset 本棚

プロジェクトウインドウで右クリックして、「Create」→「UnityARKitPlugin」→「ARReferenceObjectsSetAsset」 を選択してください。

f:id:nn_hokuson:20190621223420p:plain:w400

作成したARReferenceObjectsSetAssetのファイル名はObjectsSetにしました。

f:id:nn_hokuson:20190621223456p:plain:w300

いま作成したObjectsSetのインスペクタに上で作成したyadonObjectを登録します。Resource Group Nameはtest、Reference Object AssetsのSizeを「1」にして、Element 0の欄にyadonObjectをドラッグ&ドロップします。

f:id:nn_hokuson:20190621223707j:plain

このReference Object Assetsに登録したObjectAssetが立体マーカーとして検出される対象になります。

ARReferenceObjectsSetAssetを登録する

上のステップで作成したARReferenceObjectsSetAssetをシステムに登録します。ヒエラルキーウインドウでARCameraManagerを選択します。インスペクタのUnityARCameraManagerのObject Trackingの項目を見てください。Detection Objectの欄に先程のObjectsSetをドラッグ&ドロップします。

f:id:nn_hokuson:20190621223945j:plain

これでオブジェクトトラッキングが行われるようになります。ただ、このままではARマーカーを見つけても何も起こりません。マーカーを見つけたときには3Dモデルを表示するようにしましょう。

画像と表示するモデルを関連づける

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

f:id:nn_hokuson:20190625190902j:plain:w500

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

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

f:id:nn_hokuson:20190621224225j:plain

ターゲットの画像マーカーが見つかった場合は、Generate Object Anchorスクリプトの中のAddObjectAnchorが呼び出されます。また、画像マーカーの位置が更新された場合にはUpdateObjectAnchorが呼び出されます。

RemoveObjectAnchorもありますが、これは画像マーカーが画面外に出たときに呼び出されるわけではありません。明示的に次のスクリプトでAnchorを破棄したときにのみ呼び出されます。

UnityARSessionNativeInterface.GetARSessionNativeInterface().RemoveUserAnchor( arImageAnchor.identifire );

オブジェクトトラッキングの確認

これでUnityとARKitを使って画像トラッキングを行う準備は完了です。実際にビルドして正しく動くか確認してみてください。

正しく設定できていれば、ARマーカーを映すと指定した3Dモデルが表示されます。