MRが楽しい

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

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

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


参考記事にある通りにチュートリアルを実施します。
ビルドし、タップ操作を行います。
f:id:bluebirdofoz:20170629010640j:plain
そのまま指を横に移動させると宇宙飛行士が回転するのは前回までと同様です。
f:id:bluebirdofoz:20170629010649j:plain
そこから更に画面外に手を移動させていくと……。
f:id:bluebirdofoz:20170629010659j:plain
指を画面内に戻すよう促す矢印が表示されました。
(宇宙飛行士の左側にある青い小さな点がそれです)
デフォルトだと小さすぎて非常に見えづらいので実用にはオブジェクトを大きくするなどの工夫が必要そうです。

ではコード確認です。今回、追加したクラスは一つです。
・HandGuidance.cs

    // Hand guidance score to start showing a hand indicator.
    // As the guidance score approaches 0, the hand is closer to being out of view.
    [Range(0.0f, 1.0f)]
    [Tooltip("When to start showing the Hand Guidance Indicator. 1 is out of view, 0 is centered in view.")]
    public float HandGuidanceThreshold = 0.5f;
(略)
  void Start()
  {
      // Register for hand and finger events to know where your hand
      // is being tracked and what state it is in.
      InteractionManager.SourceLost += InteractionManager_SourceLost;
      InteractionManager.SourceUpdated += InteractionManager_SourceUpdated;
      InteractionManager.SourceReleased += InteractionManager_SourceReleased;
(略)
    // Call these events from HandsManager. This fires when the hand is moved.
    private void InteractionManager_SourceUpdated(InteractionSourceState hand)
   {
      // Only display hand indicators when we have targeted an interactible and the hand is in a pressed state.
      if (!hand.pressed ||
                HandsManager.Instance.FocusedGameObject == null ||
                (HandsManager.Instance.FocusedGameObject != null &&
                HandsManager.Instance.FocusedGameObject.GetComponent<Interactible>() == null))
      {
        return;
      }

      // Only track a new hand if are not currently tracking a hand.
      if (!currentlyTrackedHand.HasValue)
      {
        currentlyTrackedHand = hand.source.id;
      }
        else if (currentlyTrackedHand.Value != hand.source.id)
      {
        // This hand is not the currently tracked hand, do not drawn a guidance indicator for this hand.
        return;
      }

      // Start showing an indicator to move your hand toward the center of the view.
      if (hand.properties.sourceLossRisk > HandGuidanceThreshold)
      {
        ShowHandGuidanceIndicator(hand);
      }
      else
      {
        HideHandGuidanceIndicator(hand);
      }
   }

1章で登場したInteractionManagerクラスの SourceUpdated 関数をイベントの取得に利用しているようです。
bluebirdofoz.hatenablog.com

ここで注目すべきは InteractionSourceState hand 引数です。
検出した手の情報が保持されており、手の座標などがここから取得可能です。
今回のチュートリアルは sourceLossRisk という0~1で表される喪失リスクを利用しています。
docs.unity3d.com
blog.d-yama7.com