MRが楽しい

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

EventTriggerを用いてマウスのクリックとhololensのタップを検出する

本日は hololens の技術調査枠です。
EventTrigger コンポーネントと HoloToolKit を用いてマウスのクリックと hololens のタップを検出します。
これを用いると簡易に、Unity上のデバッグでタップ時の動作を確認しつつ、開発を行うことができます。

手順について一からまとめたものを記録します。
新規プロジェクトを作成し、HoloToolKitをインポートします。
f:id:bluebirdofoz:20170924030426j:plain

インポートできました。いつもの hololens アプリの設定反映を行います。
今回の処理では Capability の追加設定は不要です。
f:id:bluebirdofoz:20170924030531j:plain

Hierarchy 上で右クリック UI -> EventSystem で EventSystem オブジェクトを作成します。
f:id:bluebirdofoz:20170924030543j:plain

EventSystem オブジェクトに以下のコンポーネントを追加でアタッチします。
・Holo Lens Input
・Holo Lens Input Module
f:id:bluebirdofoz:20170924030551j:plain

MainCamera に PhysicsRaycaster コンポーネントを追加します。
f:id:bluebirdofoz:20170924031816j:plain

環境の準備は完了です。
後はイベントをキャッチして動作するオブジェクトとスクリプトを何でも良いので作成します。
今回はタップ操作を行うと、サイズが大きくなる Sphere を作成します。

タップ対象となるオブジェクトとして Sphere オブジェクトを適当な位置に追加します。
f:id:bluebirdofoz:20170924030603j:plain

Sphere オブジェクトに EventTrigger コンポーネントをアタッチします。
f:id:bluebirdofoz:20170924030612j:plain

AddNewEventType をクリックして、PointerClick を選択します。
f:id:bluebirdofoz:20170924030623j:plain

PointerClick セクションが追加されるので、「+」ボタンをクリックします。
f:id:bluebirdofoz:20170924030633j:plain

以下のように PointerClick のイベントが追加されました。
f:id:bluebirdofoz:20170924030648j:plain

呼び出すイベント関数を設定する必要がありますので、TapEvent.cs スクリプトを作成します。
f:id:bluebirdofoz:20170924030715j:plain

TapEvent.cs スクリプトには以下のように、タップ時に呼び出されるイベント関数を定義します。
・TapEvent.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TapEvent : MonoBehaviour {
  public void OnClickTapEvent()
  {
    // アタッチされているオブジェクトのサイズを 0.1f 拡大する
    this.transform.localScale = this.transform.localScale + new Vector3(0.1f, 0.1f, 0.1f);
    // クリックログ
    Debug.Log("OnClick");
  } 
}

作成した TapEvent スクリプトを Sphere オブジェクトにアタッチします。
f:id:bluebirdofoz:20170924030728j:plain

登録したイベント関数を EventTrigger に設定します。
まずオブジェクト欄横の「◎」ボタンをクリックして SelectObject ウィンドウを表示します。
プロジェクト内のオブジェクト一覧が表示されるので、TapEvent スクリプトをアタッチした Sphere オブジェクトを設定します。
f:id:bluebirdofoz:20170924030738j:plain

するとファンクション欄の選択肢に、Sqhere オブジェクトにアタッチしたコンポーネント一覧が表示されます。
TapEvent スクリプトを選ぶと、作成した OnClickTapEvent 関数が表示されますので、これを選択します。
f:id:bluebirdofoz:20170924030747j:plain

以上でオブジェクトとイベントの設定も完了です。
Unity での再生ボタンをクリックしてプロジェクトを実行してみます。
f:id:bluebirdofoz:20170924031511j:plain

ゲームビュー内で Sphere オブジェクトをクリックすると……。
f:id:bluebirdofoz:20170924030821j:plain
TapEvent.OnClickTapEvent 関数が呼び出され、Sphere オブジェクトが拡大されてログ出力が行われました。

さて、次は hololens 上での確認です。
そのまま File -> BuildSettings から BuildSettings ウィンドウを開いてビルドします。
f:id:bluebirdofoz:20170924030831j:plain

hololens にインストールして実行すると、Sphere オブジェクトが表示されます。
f:id:bluebirdofoz:20170924030843j:plain

Sphere オブジェクトを視界中央に捉えた状態で、タップ動作を行うと……。
f:id:bluebirdofoz:20170924030853j:plain
イベント関数が呼び出され、Sphere オブジェクトが拡大されました。成功です。

この手法を用いると、hololens 上でのタップ操作時のデバッグが Unity 上で簡易に行えます。
どんなアプリでも利用する操作なのでまとめておきます。

因みに、このプロジェクトのままだと hololens アプリ利用時には何処にカーソルしているかが分かり辛いです。
カーソル表示などと組み合わせると、より実用性が増すと思います。
bluebirdofoz.hatenablog.com
(今回の場合、衝突判定先の Sphere オブジェクトのレイヤは UI ではないので注意)

hololens用DevicePortalの機能についてまとめる(Apps[アプリ])

DevicePortal調査枠です。
bluebirdofoz.hatenablog.com

hololens用DevicePortalの「Apps (アプリ)」ページについてまとめます。
f:id:bluebirdofoz:20170923000315j:plain

HoloLensにインストールされているアプリを管理します。
表示されている情報は以下の通りです。

[Installed apps] (インストールされているアプリ) セクション
1.[Remove] (削除)
  選択したアプリケーションを削除します。
2.[Start] (開始)
  選択したアプリケーションを開始します。

[Running apps] (実行中のアプリ) セクション
3.[PID] (プロセスID)
  アプリのプロセスIDを表示します。
4.[NAME] (アプリ名)
  アプリの名称を表示します。
5.[VIERSION] (バージョン番号)
  アプリのバージョン番号を表示します。
6.[PACKAGE FULL NAME](パッケージ名)
  アプリのパッケージ名を表示します。
7.[USER NAME](ユーザ名)
  アプリを実行しているアカウント名を表示します。

[Install apps] (アプリのインストール) セクション
8.[App package] (アプリパッケージ)
  hololensにインストールするアプリパッケージをPCから選択できます。
9.[Dependency](依存関係)
  インストールするアプリケーションの依存関係ファイルをPCから選択できます
10.[Go](実行)
  選択したアプリケーションパッケージと依存関係ファイルをhololensに展開します。
11.[Reset](リセット)
  選択したフィールドをクリアします。

本ページでのアプリインストール方法について以下にまとめています。
bluebirdofoz.hatenablog.com


参考ページ
・Using the Windows Device Portal
 https://developer.microsoft.com/en-us/windows/mixed-reality/using_the_windows_device_portal

hololens用DevicePortalの機能についてまとめる(System Performance[システム パフォーマンス])

DevicePortal調査枠です。
bluebirdofoz.hatenablog.com

hololens用DevicePortalの「System Performance (システム パフォーマンス)」ページについてまとめます。
f:id:bluebirdofoz:20170922013553j:plain

電力使用量、フレームレート、CPU負荷などのシステム診断情報のリアルタイムグラフを表示します。
表示されている情報は以下の通りです。

f:id:bluebirdofoz:20170922013433j:plain
1.[SoC power] (電力使用量)
  システムオンチップの瞬間的な消費電力、1分間の平均電力を表示します。
2.[System power] (システム電力)
  システム電力の瞬間的な消費電力、1分間の平均電力を表示します。
3.[Frame rate] (フレームレート)
  1秒あたりのフレーム数、1秒あたりに失敗した VBlank 数、連続で失敗した VBlank 数を表示します。

f:id:bluebirdofoz:20170922013508j:plain
4.[CPU]
  CPU使用率を表示します。
5.[GPU]
  GPUエンジンの使用率を表示します。

f:id:bluebirdofoz:20170922013523j:plain
6.[I/O]
  読み取りバイト数、書き込みバイト数を表示します。
7.[Network] (ネットワーク)
  ネットワーク通信の受信バイト数、送信バイト数を表示します。
8.[Memory] (メモリ)
  一時メモリの合計、使用バイト数を表示します。


参考ページ
・HoloLens 用 Device Portal
 https://docs.microsoft.com/ja-jp/windows/uwp/debug-test-perf/device-portal-hololens
・Using the Windows Device Portal
 https://developer.microsoft.com/en-us/windows/mixed-reality/using_the_windows_device_portal

ARとVRデバイスを色々調べてまとめる(Acer Windows Mixed Reality Headset)

ARとVRデバイスを色々調べてまとめる VR枠その4 Acer Windows Mixed Reality Headset です。
bluebirdofoz.hatenablog.com

Acer Windows Mixed Reality Headset

f:id:bluebirdofoz:20170921031749p:plain

www.acer.com

スペック

本体スペック

OS外部PC接続
スピーカー3.5mmイヤフォンジャック
電源USB給電
重量410g

外部PC要求スペック(Mixed Reality Ready)

CPUIntel Core i5 (第7世代) CPU, 2コア
Hyper-Threading Technology 対応
GPUIntel HD Graphics 620以上のDX12対応GPU
メモリ8GB DDR3 Dual Channel
HDD10GBの空き
OSWindows 10(RS3)Fall Creators Update

外部PC要求スペック(Mixed Reality Ultra)

CPUIntel Core i5 (第4世代) CPU 4コア以上
AMD FX-4350 4.2Ghz 4コア以上
GPUNVidia GTX 965M / AMD RX 460以上のDX12対応GPU
メモリ8GB DDR3
HDD10GBの空き
OSWindows 10(RS3)Fall Creators Update

ディスプレイ

HMDパネル液晶パネル
視野角約95度
解像度(全体)2880×1440
解像度(片目)1440×1440
リフレッシュレート(Ready環境)60fps
リフレッシュレート(Ultra環境)90fps

搭載センサ

ラッキングセンサジャイロスコープ/加速度計/磁力計
ラッキングカメラ内蔵カメラx2、外部カメラ不要
ルームスケールサイズ上限無し
参考:「Windows Mixed Reality ヘッドセット」 レビュー
   http://indiegame-japan.com/blog/2017/08/31/post-3368/
参考:AcerとHP製の「Windows Mixed Reality」対応HMDデベロッパー版がプレオーダー開始
   http://www.itmedia.co.jp/pcuser/articles/1705/12/news050.html
参考:AcerWindows Mixed Reality対応の開発者向けMR HMDを国内で予約受付開始
   http://www.4gamer.net/games/999/G999902/20170523011/
参考:AcerのMRヘッドセットのハンズオンレビューが公開
   https://vrinside.jp/news/acer-mr-headset-review/

価格

本体のみ40,000円
コントローラー同梱版44,000円
※1 開発者向け販売価格
※2 コントローラー同梱版は2017年末の発売予定

長所/短所

長所

・トラッキングカメラ内蔵によって外部カメラ無しでルームスケールVRを実現
・ルームスケールVRとしては安価な価格設定
Windows Mixed Realityの共通プラットフォームでの開発/利用環境

短所

・ルームスケールVRの中では視野角が狭い
・対応アプリ(UWPアプリ)の少なさ
・起動には外部PCが必要

アプリ開発環境

Visual Studio 2017
Windows Insider Preview SDK
Windows 10 Creators Update
・Unity 2017.2 Beta with Mixed Reality Support
・Unity Mixed Reality Technical Preview
参考:Install the tools
   https://developer.microsoft.com/en-us/windows/mixed-reality/install_the_tools

感想

Acer社から開発者向けに販売されているHUD型VRデバイスです。
筆者は本デバイスについて未購入です。

優れた点について

本デバイスの最も優れた点は「外部カメラが不要なルームスケールVR」と考えます。
機器は本体のみで利用可能であり、接続もPCに必要な端子は HDMIx1, USB3.0x1 のみと非常にシンプルです。
このため、Oculus Rift や HTC Vive と比べてセットアップが非常に簡易です。
ラッキング精度が若干劣ることになりますが、さほど気にならないというレビュー記事が多いです。
hololensのトラッキング精度を考えても十分なトラッキング精度があるものでしょう。

Windows Mixed Realityの共通プラットフォーム

開発者にとってはこちらの方が最大の利点と感じるかと思います。
hololensと同様のプラットフォームであり、hololens向けに開発したアプリは本デバイスでも実行可能です。
開発知識の共有もしやすく、充実したチュートリアルがあるため、開発者の負担はとても軽いです。

他のルームスケールVRと比較した際の欠点

視野角95度は他のルームスケールVRと比較して狭いです。
Oculus Rift, HTC Vive の110度は言わずもがな、PSVR, GearVR の100度よりも狭い視野となっています。
また、開発環境は整備されているものの Windows MR 向けのアプリはまだ充実しているとは言い難いです。
特に一般ユーザがエンターティメント目的で楽しめるアプリが不足しています。
Steam VR への対応が告知されていますが、対応時期については不明です。
Windows Mixed RealityヘッドセットがSteamコンテンツに対応
 http://pc.watch.impress.co.jp/docs/news/1077884.html

Ready環境とUltra環境について

外部PC要求スペックを2種類記載しています。
Windows MR はゲーミングPCを持たないローエンドなコンピューターのサポートもターゲットにしているためです。
Ready環境では60FPSとなり、トラッキングの遅延も発生するため、酔いの原因になる可能性があります。
それでもハイエンドなPCを持たないユーザにとってはルームスケールVRを体験する有力な選択肢になるでしょう。
参考:Windows MRヘッドセット、2種類のPC動作要件が判明 ゲーミングPCでなくても動作
   http://www.moguravr.com/windows-mr/

コンシューマ版について

因みに10月にはコンシューマー版の販売が予定されています。
ヘッドバンドの改良などが加わるのみで、スペックに変化はないそうです。
Acer、MRヘッドセットの製品版、ヘッドバンドなどデザイン改良
 http://www.moguravr.com/acer-mr-headset-3/

HoloToolKitのSharingメッセージを拡張する

本日は hololens の技術調査枠です。
以下の記事を参考に、Sharing で共有する情報を追加します。
bril-tech.blogspot.jp

以下の Sharing 環境の構築を行ったプロジェクトを前提とします。
bluebirdofoz.hatenablog.com

初めに CustomMessages.cs に新しい MessageID を追加します。
f:id:bluebirdofoz:20170920001323j:plain

今回は3つのTransform情報と2つのモード情報を転送します。
・CustomMessages.cs

public enum TestMessageID : byte
{
    HeadTransform = MessageID.UserMessageIDStart,
    MainTransform,       // MainオブジェクトのTransform情報
    SimulationTransform, // SimulationオブジェクトのTransform情報
    PanelTransform,      // PanelオブジェクトのTransform情報
    PanelMode,   // PanelオブジェクトのMode情報
    TapMode,     // Tap操作のMode情報
    Max
}

次に、追加したIDに対応する SendMessage 関数を作成します。
一例としてMainTransform情報の送信関数は以下のようなメソッドを追加します。
・CustomMessages.cs

public void SendMainTransform(Vector3 position, Quaternion rotation, Vector3 scale)
{
    // If we are connected to a session, broadcast our head info
    if (serverConnection != null && serverConnection.IsConnected())
    {
        // Create an outgoing network message to contain all the info we want to send
        NetworkOutMessage msg = CreateMessage((byte)TestMessageID.MainTransform);

        AppendTransformScale(msg, position, rotation, scale);

        // Send the message as a broadcast, which will cause the server to forward it to all other users in the session.
        serverConnection.Broadcast(
    msg,
    MessagePriority.Immediate,
    MessageReliability.UnreliableSequenced,
    MessageChannel.Avatar);
    }
}

private void AppendTransformScale(NetworkOutMessage msg, Vector3 position, Quaternion rotation, Vector3 scale)
{
    AppendVector3(msg, position);
    AppendQuaternion(msg, rotation);
    AppendVector3(msg, scale);
}


またMode情報の送信関数は以下のようなメソッドを追加します。
・CustomMessages.cs

public void SendPanelMode(byte val)
{
    // If we are connected to a session, broadcast our head info
    if (serverConnection != null && serverConnection.IsConnected())
    {
        // Create an outgoing network message to contain all the info we want to send
        NetworkOutMessage msg = CreateMessage((byte)TestMessageID.PanelMode);

        msg.Write(val);

        // Send the message as a broadcast, which will cause the server to forward it to all other users in the session.
        serverConnection.Broadcast(
    msg,
    MessagePriority.Immediate,
    MessageReliability.UnreliableSequenced,
    MessageChannel.Avatar);
    }
}

後は作成した関数を送信したいタイミングで実行します。
・GameManager.cs

public void SetTapObjectMode(ETapObjectMode a_ETapObjectMode)
{
    if (p_ETapObjectMode != ETapObjectMode.Locked)
    {
        p_ETapObjectMode = a_ETapObjectMode;
        HoloToolkit.Sharing.Tests.CustomMessages.Instance.SendTapMode((byte)p_ETapObjectMode);
    }
}

・EGameManager.cs

public enum ETapObjectMode : byte
{
    Neutral = 0,
    Nothing = 1,
    Locked = 2,
    MainObject = 3
}

送信側の実装はこれで完了です。

次に受信側の設定を行います。
追加した MessageID 毎にコールバックの設定を追加します。
・GameManager.cs

private void Start()
{
    // Sharingコールバックの設定
    CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.MainTransform] = SharingMainTransform;
    CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.SimulationTransform] = SharingSimulationTransform;
    CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.PanelTransform] = SharingPanelTransform;
    CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.PanelMode] = SharingPanelMode;
    CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.TapMode] = SharingTapMode;
}

MainTransform情報の受信関数は以下のようなメソッドを指定します。
・GameManager.cs

/// <summary>
/// MainオブジェクトのTransformコールバック関数
/// </summary>
/// <param name="msg">受信メッセージ</param>
private void SharingMainTransform(NetworkInMessage msg)
{
    // Parse the message
    long userID = msg.ReadInt64();
    Vector3 transformPosition = CustomMessages.Instance.ReadVector3(msg);
    Quaternion transformRotation = CustomMessages.Instance.ReadQuaternion(msg);
    Vector3 transformScale = CustomMessages.Instance.ReadVector3(msg);

    // set Transform
    Transform transformObject = p_ViewerMainObject.transform;
    transformObject.position = transformPosition;
    transformObject.rotation = transformRotation;
    transformObject.localScale = transformScale;
}

PanelMode情報の受信関数は以下のようなメソッドを指定します。
・GameManager.cs

/// <summary>
/// PanelオブジェクトのModeコールバック関数
/// </summary>
/// <param name="msg">受信メッセージ</param>
private void SharingPanelMode(NetworkInMessage msg)
{
    // Parse the message
    long userID = msg.ReadInt64();
    int modeByteVal = msg.ReadByte();
    EShowPanelMode panelMode = (EShowPanelMode)System.Enum.ToObject(typeof(EShowPanelMode), modeByteVal);

    // set Mode
    p_EShowPanelMode = panelMode;
    // 状態を反映する
    p_ActiveManager.SetActiveEShowPanelMode(p_EShowPanelMode);
}

以上で Sharing 情報の追加は完了です。

hololens用DevicePortalの機能についてまとめる(Processes[プロセス])

DevicePortal調査枠です。
bluebirdofoz.hatenablog.com

hololens用DevicePortalの「Processes (プロセス)」ページについてまとめます。
f:id:bluebirdofoz:20170919034105j:plain

現在実行中のプロセスの詳細を表示します。
アプリとシステムの両方のプロセスが含まれます。

1.[PID] (プロセスID)
  プロセスのプロセスIDを表示します。
2.[NAME] (プロセス名)
  プロセスのプロセス名を表示します。
3.[USER NAME] (ユーザ名)
  プロセスの実行アカウント権限を表示します。
4.[SESSION ID] (セッションID)
  プロセスのセッションID(ユーザ環境)を表示します。
5.[CPU] (CPU使用率)
  プロセスのCPUの使用率を表示します。
6.[PRIVATE WORKING SET] (プライベートワーキングセット)
  プロセスに割り当てられているメモリのサイズを表示します。共有メモリは除外されます。
7.[WORKING SET] (ワーキングセット)
  プロセスに実際に割り当てられている物理メモリのサイズを表示します。
8.[COMMIT SIZE] (コミットサイズ)
  プロセスが必要としているメモリのサイズを表示します。
  HDD にスワップされているのも含みます。共有メモリは除外されます。


参考ページ
・HoloLens 用 Device Portal
 https://docs.microsoft.com/ja-jp/windows/uwp/debug-test-perf/device-portal-hololens
・Using the Windows Device Portal
 https://developer.microsoft.com/en-us/windows/mixed-reality/using_the_windows_device_portal

HoloLensの開発環境構築手順 SketchUp編

Blender では利用できない3Dデータの編集のため、SketchUpをインストールしました。
端的に説明すると、SketchUpは3次元モデリングソフトウェアです。
SketchUp のインストール手順を記録しておきます。

SketchUp のダウンロードページは以下です。
www.sketchup.com

SketchUpをダウンロード」をクリックしてダウンロードページを開きます。
f:id:bluebirdofoz:20170918120251j:plain

初めに製品を選択します。
非商用利用であれば「個人的なプロジェクト」を選択し、無償版を利用可能です。
f:id:bluebirdofoz:20170918120301j:plain

Eメールを入力し、アンケートに回答したら「ダウンロード」をクリックしてインストーラを取得します。
f:id:bluebirdofoz:20170918120312j:plain

ダウンロードしたSketchUpMake-ja-x64.exeを実行します。
最初にSketchUpで必要なコンポーネントのインストール画面が開くのでこれらをインストールします。
f:id:bluebirdofoz:20170918120324j:plain

インストーラが起動するので「次へ」をクリックします。
f:id:bluebirdofoz:20170918120340j:plain

インストール先フォルダを指定して「次へ」をクリックします。
f:id:bluebirdofoz:20170918120408j:plain

「続行」をクリックするとインストールを開始します。
f:id:bluebirdofoz:20170918120416j:plain

以上で SketchUp のインストールは完了です。
f:id:bluebirdofoz:20170918120425j:plain