MRが楽しい

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

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

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


参考記事にある通りにチュートリアルを実施します。
ビルドすると、カーソルに新しく左右の矢印が表示されています。
f:id:bluebirdofoz:20170628004740j:plain
指を正面に掲げてタップ操作します。
f:id:bluebirdofoz:20170628004747j:plain
そのまま、指を横に動かすと……。
f:id:bluebirdofoz:20170628004755j:plain
宇宙飛行士が指の動きに合わせてクルクルと横回転します。

今回の追加コードの要点を確認してみます。
・GestureActionr.cs

    [Tooltip("Rotation max speed controls amount of rotation.")]
    public float RotationSensitivity = 10.0f;
(略)
    private void PerformRotation()
    {
        if (GestureManager.Instance.IsNavigating &&
            (!ExpandModel.Instance.IsModelExpanded ||
            (ExpandModel.Instance.IsModelExpanded && HandsManager.Instance.FocusedGameObject == gameObject)))
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate rotationFactor based on GestureManager's NavigationPosition.X and multiply by RotationSensitivity.
            // This will help control the amount of rotation.
            rotationFactor = GestureManager.Instance.NavigationPosition.x * RotationSensitivity;

            // 2.c: transform.Rotate along the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

早速ですが、オブジェクトの回転を行っているコードです。
GestureManager.Instance.NavigationPosition.x で指の横方向の動きの量を取得し、それに合わせて宇宙飛行士を、Y軸を回転軸として回転させています。
このとき、回転に -1 を掛けているのは宇宙飛行士がプレイヤー側を向いているからです。
宇宙飛行士にとってのローカルの回転軸はプレイヤーと逆になります。

因みに GestureManager.Instance.NavigationPosition の取得コードは以下です。
・GestureActionr.cs

  public Vector3 NavigationPosition { get; private set; }
(略)
  void Awake()
  {
      /* TODO: DEVELOPER CODING EXERCISE 2.b */

      // 2.b: Instantiate the NavigationRecognizer.
      NavigationRecognizer = new GestureRecognizer();

      // 2.b: Add Tap and NavigationX GestureSettings to the NavigationRecognizer's RecognizableGestures.
      NavigationRecognizer.SetRecognizableGestures(
                                GestureSettings.Tap |
                                GestureSettings.NavigationX);

      // 2.b: Register for the TappedEvent with the NavigationRecognizer_TappedEvent function.
      NavigationRecognizer.TappedEvent += NavigationRecognizer_TappedEvent;
      // 2.b: Register for the NavigationStartedEvent with the NavigationRecognizer_NavigationStartedEvent function.
      NavigationRecognizer.NavigationStartedEvent += NavigationRecognizer_NavigationStartedEvent;
      // 2.b: Register for the NavigationUpdatedEvent with the NavigationRecognizer_NavigationUpdatedEvent function.
      NavigationRecognizer.NavigationUpdatedEvent += NavigationRecognizer_NavigationUpdatedEvent;
      // 2.b: Register for the NavigationCompletedEvent with the NavigationRecognizer_NavigationCompletedEvent function.
      NavigationRecognizer.NavigationCompletedEvent += NavigationRecognizer_NavigationCompletedEvent;
      // 2.b: Register for the NavigationCanceledEvent with the NavigationRecognizer_NavigationCanceledEvent function.
      NavigationRecognizer.NavigationCanceledEvent += NavigationRecognizer_NavigationCanceledEvent;
(略)
  private void NavigationRecognizer_NavigationStartedEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray)
  {
      // 2.b: Set IsNavigating to be true.
      IsNavigating = true;

      // 2.b: Set NavigationPosition to be relativePosition.
      NavigationPosition = relativePosition;
  }

  private void NavigationRecognizer_NavigationUpdatedEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray)
  {
      // 2.b: Set IsNavigating to be true.
      IsNavigating = true;

      // 2.b: Set NavigationPosition to be relativePosition.
      NavigationPosition = relativePosition;
  }

GestureRecognizerクラスはUnityEngine.VR.WSA.Inputパッケージのクラスです。
このクラスが持つ NavigationStartedEvent 関数の relativePosition 引数として指の位置情報が取得できるということですね。
ただし、ここで取得できているのはタップ開始時からの相対位置のようです。