サイトアイコン NegativeMindException

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の座標系へ変換できます。
例えば以下のように。

camera.transform.localPosition = UnityARMatrixOps.GetPosition(matrix);
camera.transform.localRotation = UnityARMatrixOps.GetRotation(matrix);

(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


スポンサーリンク

関連記事

  • フィーリングに基づくタマムシの質感表現
  • OpenVDB:3Dボリュームデータ処理ライブラリ
  • SONYの自律型エンタテインメントロボット『aibo』
  • NumSharp:C#で使えるNumPyライクな数値計算ライブラリ
  • 写真から3Dメッシュの生成・編集ができる無料ツール『Autodesk Memento』
  • ポリゴンジオメトリ処理ライブラリ『pmp-library (Polygon Mesh Process...
  • Unityで360度ステレオVR動画を作る
  • ペイントマネージャー:模型塗料を管理できるスマホアプリ
  • ブログをGoogle App EngineからAmazon EC2へ移行
  • Google Earth用の建物を簡単に作れるツール Google Building Maker 公...
  • テスト
  • Cartographer:オープンソースのSLAMライブラリ
  • MythTV:Linuxでテレビの視聴・録画ができるオープンソースプロジェクト
  • ZBrush 4R7
  • 頭蓋骨からの顔復元と進化過程の可視化
  • OpenCV 3.1のsfmモジュールのビルド再び
  • iPhone・iPod touchで動作する知育ロボット『ROMO』
  • 株式会社ヘキサドライブの研究室ページ
  • 注文してた本が届いた
  • Managing Software Requirements: A Unified Approach
  • Unity ARKitプラグインサンプルのドキュメントを読む
  • ZBrush 2021.6のMesh from Mask機能を使ってみる
  • OpenCVで顔のランドマークを検出する『Facemark API』
  • 新年の衝動買い
  • Math.NET Numerics:Unityで使える数値計算ライブラリ
  • 映画から想像するVR・AR時代のGUIデザイン
  • ZBrushで仮面ライダー3号を造る 仮面編 Clay Polish
  • CreativeCOW.net
  • UnityからROSを利用できる『ROS#』
  • AmazonEC2のインスタンスをt1.microからt2.microへ移行する
  • UnityユーザーがUnreal Engineの使い方を学ぶには?
  • 書籍『3次元コンピュータビジョン計算ハンドブック』を購入
  • WordPress on Windows Azure
  • Alice Vision:オープンソースのPhotogrammetryフレームワーク
  • iPhone x ロボットハッカソン~RomoのiPhone用SDKで目覚ましアプリを作る~
  • After Effects全エフェクトの解説(6.5)
  • マイケル・ベイの動画の感覚
  • 動的なメモリの扱い
  • 池袋パルコで3Dのバーチャルフィッティング『ウェアラブル クロージング バイ アーバンリサーチ』
  • 実写と実写の合成時の色の馴染ませテクニック
  • Super Resolution:OpenCVの超解像処理モジュール
  • Live CV:インタラクティブにComputer Visionコーディングができるツール
  • モバイルバージョンを終了