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


スポンサーリンク

関連記事

この本読むよ

Unityで学ぶC#

OpenMVS:Multi-View Stereoによる3次元復元ライブラリ

映画『ゴジラ-1.0』 メイキング情報まとめ

Unreal EngineでARKit 3.0

中学3年生が制作した短編映像作品『2045』

書籍『開田裕治 怪獣イラストテクニック』

ZBrushの練習 手のモデリング

ZBrushで仮面ライダー3号を造る 仮面編 失敗のリカバー

「ベンジャミン·バトン数奇な人生」でどうやってCGの顔を作ったのか

3D復元技術の情報リンク集

UnityのMonoBehaviourクラスをシングルトン化する

法線マップを用意してCanvas上でShadingするサンプル

ガメラ生誕50周年

書籍『ROSプログラミング』

Raspberry Pi 2のGPIOピン配置

OpenCVでiPhone6sのカメラをキャリブレーションする

マルコフ連鎖モンテカルロ法

Raspberry Piでセンサーの常時稼働を検討する

Blender 2.81でIntel Open Image Denoiseを使う

Pix2Pix:CGANによる画像変換

adskShaderSDK

AndroidもopenGLも初心者さ (でもJavaは知ってるよ)

ゴジラ三昧

2018年に購入したiPad Proのその後

PeopleSansPeople:機械学習用の人物データをUnityで生成する

Deep Learningとその他の機械学習手法の性能比較

昔Mayaでモデリングしたモデルをリファインしてみようか

OpenGV:画像からカメラの3次元位置・姿勢を推定するライブラリ

ZBrushCore

レンダラ制作はOpenGL とか DirectX を使わなくてもできるんだぜ

Google Colaboratoryで遊ぶ準備

『PIXARのひみつ展』に行ってきた

3D映画のポストプロダクション 2D-3D変換

2012のメイキングまとめ(途中)

ブログのデザイン変えました

ZBrushで仮面ライダー3号を造る 仮面編 ClipCurve

プログラムによる景観の自動生成

Webサイトのワイヤーフレームが作成できるオンラインツール

Managing Software Requirements: A Unified Approach

DensePose:画像中の人物表面のUV座標を推定する

ZBrushでアヴァン・ガメラを作ってみる 歯茎を別パーツへ分割

コメント