Unity ARKitプラグインサンプルのチュートリアルを読む

Unity-ARKit-PluginTUTORIAL.txtはQiitaに日本語訳を投稿した人がいるから良いかと思ってたけど、最新版ではこの記事よりも情報が増えているようだ。
https://qiita.com/arumani/items/74dc65ceb9c90bd986ee

↑この記事ではステップが13までだけど、最新版にはステップが16まで書いてある。


スポンサーリンク


ということで、TUTORIAL.txtをちゃんと読んでみる。
Unity-ARKit-Plugin/TUTORIAL.txt

Unity-ARKit-Plugin ステップバイステップ

1. まずARKitについて大まかにどのような機能があるのかこちらを読みましょう。
このUnity-ARKit-Pluginは、ARKitのネイティブインターフェースに対応したScript APIを提供します。そして、GameObjectコンポーネントにScriptをアタッチしてこのインターフェースを使用します。

2. このプロジェクトのサンプルsceneを参照して、ARKitアプリがどのように作られているのか確認してください。
UnityARSessionNativeInterface.csNativeInterfaceフォルダが最も低レベルのScript APIです。以下から詳細を説明します。

3. ARKitのネイティブsessionインターフェースの取得にはUnityARSessionNativeInterface.GetARSessionNativeInterface()関数を使用します。
このチュートリアルでは以降このsessionをm_sessionと表記します。(UnityARCameraManager.csを参照)

4. m_session.RunWithConfig(config)関数をコールしてARSessionを作成します。引数configには用途に応じてARKitWorldTrackingSessionConfiguration(6DOF)かARKitSessionConfiguration(3DOF)と対応するパラメータセットを指定します。
m_session.RunWithConfigAndOption(config, option)でsessionを初期化することもできます。引数optionを使用すると、すでに開始済みのsessionをリセットできます。(UnityARCameraManager.csを参照)

5. ARKitからカメラの位置・回転を取得するには、update毎にm_session.GetCameraPose()を使用してください。取得したカメラの位置・回転はユーティリティ関数でUnityの座標系へ変換できます。
例えば以下のように。

(UnityARCameraManager.csを参照)

6. ARKitのカメラのprojection parametersを取得するにはupdate毎にm_session.GetCameraProjection()を使用してください。それをUnityカメラに設定するにはcamera.projectionMatrixを使用します。

7. sceneのMain CameraにUnityARVideo MonoBehaviourコンポーネントを追加して、inspectorでClear Materialにプロジェクト内にあるYUVMaterialを設定します。
UnityARVideo.cs Scriptの中を読めば、何を行っているのか理解できます。
このScriptは、毎フレームARKitカメラで撮影される映像(YUV信号)を2枚のテクスチャとして取得し、YUVMaterial shaderで結合してMain Cameraの背景映像にします。背景映像でリニアレンダリングを使用したい場合は、このコンポーネントでClear MaterialをYUVMaterialLinearに設定できます。

8. ここまでのステップで、sceneに3Dオブジェクトを配置してビルド・実行すれば、配置した3Dオブジェクトをデバイスから眺めたり、視点を移動できるようになります。

9. ARKitが提供するHitTest APIを使用すればsceneとのインタラクションを実現できます。
scene内でhit結果の種類についてはこちらを参照してください。
m_session.HitTest(point, resultTypes)関数はhit結果のリストを返します。この結果を使用してバーチャルObjectを配置する場所を決定できます。(UnityARHitTestExample.csを参照)

10. sessionを設定してARKitで平面を検出したい場合は、ARKitが返す以下のイベントにプラグインを通じてフックできます:


スポンサーリンク
  • UnityARSessionNativeInterface.ARAnchorAddedEvent
  • UnityARSessionNativeInterface.ARAnchorUpdatedEvent
  • UnityARSessionNativeInterface.ARAnchorRemovedEvent

これらのdelegateは全てAnchorUpdate(ARPlaneAnchor arPlaneAnchor)という形式を取ります。検出した平面に対応するGameObjectをレンダリングすることもできますし、単にanchorとして利用することもできます。(UnityARAnchorManager.csを参照)

11. ARKitから取得できるフレームのアップデートには点群データが含まれており、これを取得するにはイベントUnityARSessionNativeInterface.ARFrameUpdatedEventをフックします。このdelegateはARFrameUpdated(unityarcamera)の形式を取ります。そして、unityarcamera.pointCloudDataから点群データを得ることができます。
(PointCloudParticleExample.csを参照)

12. 前のステップのARFrameUpdateEventは(ステップ5と6の代わりに)カメラ位置・回転・Projection Matrixの更新にも利用できます。
ただし、この値の更新がUnityレンダリングエンジンのupdateのタイミングではなく、ARKitのupdateのタイミングで行われることに注意してください。また、正しい座標系での結果を得るためにはユーティリティ関数を使う必要があるかもしれません。

13. Update毎にm_session.GetARAmbientIntensity()をコールして、sceneのLightEstimation(照明の推定)の値を得ることができます。
(UnityARAmbient.csを参照)

14. ARKitにanchorを追加したり削除することができます。UnityARUserAnchorComponentという名前のコンポーネントがあり、このAPIを使用してGameObjectをanchorに関連付けることができます。

15. UnityARSessionNativeInterfaceでARKit sessionのInterrupted / InterruptionEndedコールバックを購読してフックすることができます。

16. UnityARSessionNativeInterfaceで対応するイベントを購読することで、ARKitのtracking変更のコールバックにフックできます。

SCENES.txtに書かれている説明と重複することも結構あるな。



さて、Unity-ARKit-Plugin/README.mdによると、SCENES.txtTUTORIAL.txtには載っていないARKit 1.5とARKit 2.0のサンプルsceneについてはこっちを読めば良いのかな?
https://blogs.unity3d.com/jp/2018/02/16/developing-for-arkit-1-5-update-using-unity-arkit-plugin/
https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/53b3d3b059f2dc2de4fe9b1c62e229ca5077aa5b/docs/WhatsNewInARKit2_0.md


スポンサーリンク

関連記事

OpenCV 3.1のsfmモジュールを試す
Google App Engine上のWordPressでAmazonJSを利用する
MFnDataとMFnAttribute
AmazonEC2のインスタンスをt1.microからt2.microへ移行する
OpenCV 3.1のsfmモジュールのビルド再び
Blender 2.8がついに正式リリース!
SONY製のニューラルネットワークライブラリ『NNabla』
手持ちの模型塗料を管理できるスマホアプリ『プラカラーストック』
OpenCV 3.3.0-RCでsfmモジュールをビルド
Photoshopで作る怪獣特撮チュートリアル
フリーで使えるスカルプト系モデリングツール『Sculptris 』
Google XML Sitemap Generatorプラグインを3.4.1へダウングレード
Google Earth用の建物を簡単に作れるツール Google Building Maker 公...
ZBrush用トポロジー転送プラグイン『ZWrap Plugin for ZBrush』
Pythonの自然言語処理ライブラリ『NLTK(Natural Language Toolkit)』
『スター・ウォーズ フォースの覚醒』のVFXブレイクダウン まとめ
After Effects全エフェクトの解説(6.5)
Unite 2017 Tokyoに行ってきた
ZBrushで仮面ライダー3号を造る 仮面編 横顔のシルエットをリファレンスに合わせる
python-twitterで自分のお気に入りを取得する
Windows Server 2008にAutodesk Maya 2009をインストール
オープンソースの人体モデリングツール『MakeHuman』のAPI開発プロジェクトがスタート
Unityで使える数値計算ライブラリ『Math.NET Numerics』
iOSで使えるJetpac社の物体認識SDK『DeepBelief』
顔モデリングのチュートリアル
MythTV:Linuxでテレビの視聴・録画ができるオープンソースプロジェクト
Maya 2015から標準搭載されたMILA
Unreal Engineの薄い本
MRenderUtil::raytrace
ZBrushで仮面ライダー3号を造る 仮面編 PolyGroupを分割する
レンダラ制作はOpenGL とか DirectX を使わなくてもできるんだぜ
Unityで360度ステレオVR動画を作る
WebGL開発に関する情報が充実してきている
ZBrushのUV MasterでUV展開
スマホのカメラで3Dスキャンできるアプリ『Qlone』
Programing Guide for iPhone SDK 日本語のドキュメント
オープンソースのネットワーク可視化ソフトウェアプラットフォーム『Cytoscape』
ドラマ『ファーストクラス』のモーショングラフィックス
AndroidもopenGLも初心者さ (でもJavaは知ってるよ)
ニンテンドー3DSのGPU PICA200
2012のメイキングまとめ(途中)
openMVGをWindows10 Visual Studio 2015環境でビルドする

コメント