Hiromuブログ

最近はこちら(https://zenn.dev/hiromu)が本体

Mixed Reality Dev Days

5/2, 3にマイクロソフトにより開催されたMixed Reality Dev Daysに参加してきました。

世界中から約400人が参加したそうです。

Mixed Reality Dev Days

  • Date: May 2-3, 2019
  • Location: Microsoft Building 92 5010 NE 36th St Redmond, WA 98052
  • Evening Networking Reception: Thursday evening, 6-8pm
  • Cost: This event is free to attend. You are responsible for travel expenses.

Agenda

アジェンダは以下画像の通りで、同時間帯に複数のテクニカルセッションおよび、ハンズオンが行われました。

セッション情報については(全てではないかもしれませんが)後ほど公開されるとの話を聞いたため、5/2 A.M.の共通のセッション以外はすべてハンズオンに参加しました。

ハンズオンの内容は準備されたマニュアル通りにアプリを実装したりビルド・デプロイするものではなく、各机にHoloLens 2 が4台置いてありシェアしながら自由に使えるようになっていました。

なお、MRTKを利用したチュートリアルについては以下に公開されています。
チュートリアル

ハンズオン

あくまで開発段階のものであるため画面のキャプチャを公開することは禁止されていました。 従い以降は、実機を使っておこなったことや感じたことのまとめになります。

主に行ったこととしては

  • HoloLens 2の基本動作確認
  • HandTrackingサンプル実機確認
  • EyeTrackingサンプル実機確認
  • 手の位置の座標を取得するサンプル実装
  • パフォーマンスチェック

全てのMRTKのサンプルを実機動作確認したかったのですが、時間とHoloLens 2 実機の台数が限られていたため、HoloLens 2 の大きな特徴であるHandTracking/EyeTrackingに絞って動作確認を行いました。 他にどのようなサンプルがあるのかについては以下にまとめています。

www.hiromukato.com

www.hiromukato.com

確認環境

ハンズオンは以下環境で動作確認を行った。

  • Unity 2018.3.14f1
  • Microsoft.MixedReality.Toolkit.Unity.Foundation-v2.0.0-RC1.unitypackage
  • Microsoft.MixedReality.Toolkit.Unity.Examples-v2.0.0-RC1.unitypackage

現地で新しいMRTKが出ていることに気づいたので、パフォーマンスチェックのみ以下を利用した。

  • Microsoft.MixedReality.Toolkit.Unity.Foundation-v2.0.0-RC1-Refresh.unitypackage
  • Microsoft.MixedReality.Toolkit.Unity.Examples-v2.0.0-RC1-Refresh.unitypackage

キャリブレーション

  • 初回もしくはほかの人が被っていたHoloLens 2 を被るとCalibrationするかどうかのメッセージが表示される。あとはガイダンスに従い、オブジェクトが表示される位置を眺める(アイトラッキング)だけでキャリブレーションが完了する
  • アプリ起動中に人にHoloを渡すとアイトラッキングやジェスチャが利かなくなることがあったので、キャリブレーションが影響しているのかも?

Spaticl Mapping

  • メッシュの更新速度
    • 体感としては特にHolo1からの変化は感じなかった
  • メッシュの形状、他
    • メッシュ形状はHolo1と同じ三角
    • ステンドグラスのような色味になっており綺麗
    • エアタップすると音もなり心地よい

視野角

  • (Holo1を経験していることもあり)途中で切れているように見える違和感は特に感じなかった
  • これについては、Holo1を体験したことのない人の意見を聞いてみたい

被り心地

  • 重心位置が中心あたりに来るようになっており、重さもそれほど感じない
  • 鼻で支える必要がなくなり快適
  • 眼鏡でも大丈夫
  • 開発中にフリップアップができるのが便利
  • ケーブル接続位置も後ろの側面になっており接続したまま被れる

Windowsメニューの表示、操作方法

  • 手首あたりにWindowsのロゴが表示されるので、ロゴを指先でタッチするとメニューが表示される
  • Holo1では2m先にメニューが表示されたがHolo2では目の前に表示されるので、アイコンを人差し指で直接タッチすることで操作する
  • 指先で払うような動作をすることでスクロール操作ができる
  • 頭を動かしてもメニューは追従しなかった、Holo1に慣れているせいか少し不便に感じた

アプリ終了方法

  • ブルームがなくなったので、最初アプリの終了方法にとまどう
  • アプリ起動中に(手首のアイコンをタッチし)メニューを表示すると、一番下にホームアイコンが表示されているので、アイコンをタッチすることでアプリを終了する

EyeTracking

  • MRTKのサンプルビルドの注意点
    • Scenes In Buildの設定を以下の通りにする必要がある(0番目にRootSceneを設定する)
    • UWPのプロジェクトで「視線入力」Capabilityにチェックを付ける必要がある
  • 以下4つのサンプルの動作確認を行ったが、どれも大きなずれなどの違和感を感じることなく視線の移動に追従する動作を確認できた
  • 特にNavigationサンプルの視線の移動に合わせてマップがスクロール移動するのが興味深かった
  • Visualizerサンプルで左側部ではヒートマップをリアルタイムに確認できたが、右側のレコーディング機能は動作しなかった(不具合なのか何か設定が足りないのかは未確認)
  • Eye Trackingのセッションで推奨デザインなどの話がされていたので(公開されたら)参照したほうが良い

HandTraking

  • 以下5つのサンプルについて動作確認を行った。VRのコントローラのようなものなしで物をつかんで見まわせるのがHolo1からのUXのあり方を大きく変えそうに感じた
    • HandInteractionExamples
    • HandInteractionGestureEventsExample
    • HandInteractionPanZoomExample
    • HandInteractionUnityUIExample
    • HandJointChaserExample
  • 手が認識されると手のCGモデルが重畳表示される
  • 手のモデルの追従については多少の遅延はあるが個人的には気にならない程度だった(Leap Motionと比較すると遅延が大きいとのコメントもあり)
  • 近くのものは、その場に物があるように押したりつかんだりできる
  • 遠くのものは、Hand Raysが表示されるのでその先端が接触しているものを操作できる
  • HandTrakingについてもInput & Interaction Crach Course - Articulated Handsのセッションを参照した方が良い

手の位置の座標を取得するサンプル実装

  • 指の関節などの座標が取れるようになったので、ためしに掌の位置にオブジェクトが生成されるサンプルを実装した(何かしらのイベントをトリガーにShowObjectメソッドが呼ばれると掌にオブジェクトが生成される)。
  • ジョイントは enum TrackedHandJoint で定義されている
  • 以下の通り簡単な実装で座標位置が取得できることがわかる
  • (なかなか面白いアプリが作れたと思うので公開できないのが残念です)
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;

public class PalmSample : MonoBehaviour, IMixedRealityHandJointHandler
{
    /// <summary>
    /// 生成するオブジェクトのプレハブ
    /// </summary>
    [SerializeField]
    private GameObject pref;

    /// <summary>
    /// 掌の位置
    /// </summary>
    private Vector3 palmPos;

    void Start()
    {
        palmPos = Vector3.zero;
    }

    public void ShowObject()
    {
        var camera = CameraCache.Main.transform;
        var ray = new Ray(camera.position, camera.rotation * Vector3.forward);

        var obj = Instantiate(pref);
        obj.transform.position = palmPos;
        obj.transform.LookAt(camera);
        obj.transform.Rotate(new Vector3(0, 180, 0));
        Destroy(obj, 2);
    }

    public void OnHandJointsUpdated(InputEventData<IDictionary<TrackedHandJoint, MixedRealityPose>> eventData)
    {
        MixedRealityPose pose;
        eventData.InputData.TryGetValue(TrackedHandJoint.Palm, out pose);

        if (pose != null)
        {
            palmPos = new Vector3(pose.Position.x, pose.Position.y, pose.Position.z);
        }
    }
}

パフォーマンスチェック

  • 豆腐(Cube)をどれだけ出せるかのベンチマーク
    • デフォルトのCubeからコライダーを削除したもの
    • シェーダはデフォルトの状態のままで変更なし
    • リリースビルド
  • Cubeの数をベースにしてしまったので表がちぐはぐになってしまったが以下の通り
    (60FPSをキープできたのがHolo1が6個、Holo2が15個)
FPS HoloLens 1 HoloLens 2
60 6 15
50 20
45 10
40 30
35 40
30 60
28 20
20 100
19 30
15 40
13 200
10 60
08 300
06 100 400
05 130 500
03 200
02 300
01 400
01 500

※HoloLens 2 では数値が安定しなかったのでおおよその目安、またHoloLens 2 の状態や製品版ではパフォーマンスが変わる可能性があるのであくまで参考情報です

おわりに

  • HoloLens 2 は HoloLens 1 からの正統進化という感じでとても素晴らしい製品でした。アイトラッキングやハンドトラッキングなど操作が変わるため、実装やユーザエクスペリエンスも大きく変わってくると思いますがその分工夫のし甲斐があると感じました。発売が待ち遠しいです。