MRが楽しい

MRやVRについて学習したことを書き残す

公式チュートリアル「HOLOGRAMS 211 4章」を試してみる

本日もチュートリアルお試し枠の続きです。
HOLOGRAMS 211 4章を実施します。
いつも通り、以下ブログの記事を参考に実施します。
azure-recipe.kc-cloud.jp

参考記事にある通りにチュートリアルを実施します。
アプリを起動し、宇宙飛行士が現れたところで「Move Astronaut」と発声します。
f:id:bluebirdofoz:20170630003340j:plain
カーソルの矢印が四方向に表示が変わります。
f:id:bluebirdofoz:20170630003349j:plain
その状態で宇宙飛行士をタップして、手を動かすと……。
f:id:bluebirdofoz:20170630003559j:plain
手の動きに合わせて宇宙飛行士が移動します。

今回、技術としては目新しいものはありませんが、いつも通りコード確認していきます。
・AstronautManager.cs

    void Start()
    {
        keywordCollection = new Dictionary<string, KeywordAction>();

        // Add keyword to start manipulation.
        keywordCollection.Add("Move Astronaut", MoveAstronautCommand);
(略)
        // Initialize KeywordRecognizer with the previously added keywords.
        keywordRecognizer = new KeywordRecognizer(keywordCollection.Keys.ToArray());
        keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
        keywordRecognizer.Start();
    }

音声認識の登録箇所です。以下で実施した技術と同様です。
bluebirdofoz.hatenablog.com


タップ操作時の今回の追加コードは以下です。
・GestureAction.cs

    void PerformManipulationStart(Vector3 position)
    {
        manipulationPreviousPosition = position;
    }

    void PerformManipulationUpdate(Vector3 position)
    {
        if (GestureManager.Instance.IsManipulating)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            Vector3 moveVector = Vector3.zero;

            // 4.a: Calculate the moveVector as position - manipulationPreviousPosition.
            moveVector = position - manipulationPreviousPosition;

            // 4.a: Update the manipulationPreviousPosition with the current position.
            manipulationPreviousPosition = position;

            // 4.a: Increment this transform's position by the moveVector.
            transform.position += moveVector;
        }
    }

手の位置情報に合わせて、宇宙飛行士の位置を移動しています。

因みに、追加コードの関数呼び出しはGestureManager.csに記載済みです。
・GestureManager.cs

        private void ManipulationRecognizer_ManipulationStartedEvent(InteractionSourceKind source, Vector3 position, Ray ray)
        {
            if (HandsManager.Instance.FocusedGameObject != null)
            {
                IsManipulating = true;

                ManipulationPosition = position;

                HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationStart", position);
            }
        }

        private void ManipulationRecognizer_ManipulationUpdatedEvent(InteractionSourceKind source, Vector3 position, Ray ray)
        {
            if (HandsManager.Instance.FocusedGameObject != null)
            {
                IsManipulating = true;

                ManipulationPosition = position;

                HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationUpdate", position);
            }
        }

関数をSendMessageを使って関数名で呼び出すこのやり方、処理の繋がりを追跡するのに手間取るので、どうも慣れません。
オブジェクト間の結びつきが弱くなる点は良いんですが、それ以上に可読性が下がり過ぎな気がします。