MRが楽しい

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

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

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


記事では3章と4章が一緒くたになっていますが、内容を学習して進めたいので一つずつ進めます。
今回は3章 ターゲティングです。

参考記事にある通りにチュートリアルを実施します。
アプリをビルドすると、カーソルの移動がスムーズになるよう補正されます。
f:id:bluebirdofoz:20170523015630j:plain
…のはずなのですが、実際には実感なし。。
色々設定値を変えてみましたが、今一つ体感できる違いはありませんでした。
公式ページの動画見ても手順は間違っておらず、その動画でも分からない程度の補正のようなのでこれで正解のようです。
www.hololensdev.jp

Unity上でデバッグできれば簡単に確認できるのですが、HOLOGRAMS 210はhololens特有の機能を利用しているようでUnity上では機能が無効化されており確認できず。

とりあえずコード確認に移ります。

GazeManagerの変更箇所は以下の通りです。(210からはコードに章毎のコメントがあって読みやすい)
gazeOrigin(視点位置)とCamera.main.transform.rotation(視点向き)を元に、視点位置を補正しています。
・GazeManager.cs

void Awake()
{
    /* TODO: DEVELOPER CODING EXERCISE 3.a */

    // 3.a: GetComponent GazeStabilizer and assign it to gazeStabilizer.
    gazeStabilizer = GetComponent<GazeStabilizer>();
}

private void Update()
{
(略)

    // 3.a: Using gazeStabilizer, call function UpdateHeadStability.
    // Pass in gazeOrigin and Camera's main transform rotation.
    gazeStabilizer.UpdateHeadStability(gazeOrigin, Camera.main.transform.rotation);

    // 3.a: Using gazeStabilizer, get the StableHeadPosition and
    // assign it to gazeOrigin.
    gazeOrigin = gazeStabilizer.StableHeadPosition;

    UpdateRaycast();
}


gazeStabilizer.UpdateHeadStability関数が何をやっているかを確認します。

・gazeStabilizer.cs

/// <summary>
/// Updates the StableHeadPosition and StableHeadRotation based on GazeSample values.
/// Call this method with RaycastHit parameters to get stable values.
/// </summary>
/// <param name="position">Position value from a RaycastHit point.</param>
/// <param name="rotation">Rotation value from a RaycastHit rotation.</param>
public void UpdateHeadStability(Vector3 position, Quaternion rotation)
{
    gazePosition = position;
    gazeDirection = rotation * Vector3.forward;

    AddGazeSample(gazePosition, gazeDirection);

    UpdateInstability(out gazePositionInstability, out gazeDirectionInstability);

    // If we don't have a gravity point, just use the gaze position.
    if (!gravityPointExists)
    {
        gravityWellPosition = gazePosition;
        gravityWellDirection = gazeDirection;
        gravityPointExists = true;
    }

    UpdateGravityWellPositionDirection();
}

UpdateInstability関数、UpdateGravityWellPositionDirection関数は数学的なコードが何行も続いているので省略。
過去の視点位置、向きの情報を一定数保持して計算式を元に補正を行っています。
本gazeStabilizer.csはHoloToolKitでも提供されており、そちらでも利用可能なようです。