【UE4】Hololens2開発まとめ

Hololens2買いました。

 

なので、UE4での開発について公式のドキュメントの内容をまとめておきます。

 

 

UE4のバージョンは4.25.1で試してます。4.24以前だと使えないプラグインがあるので気を付けて下さい。

 

参考元は以下にまとめます。

 

Microsoftの公式ドキュメント。基本的にHololens2の機能の実装の仕方自体はこっちにしか載ってないので注意。

docs.microsoft.com

 

Epicの公式ドキュメント。ストリーミングとパッケージングの仕方だけ載ってる。

 

docs.unrealengine.com

環境構築ですが、EpicGamesLauncherで4.25.1をダウンロードして、オプションでHololens2をダウンロードします。

f:id:shiratori00:20200706225926p:plain

 

インストールが終わったら、日本語環境限定でエンジンソースに手を入れる必要があります。

Epic Games/UE_4.25/Engine/Source/Runtime/Core/Public/Misc/Char.h

の中身のコメントを全部消して上書き保存してください。

 

VisualStudioInstallerでUniversalWindowsプラットフォーム開発、C++デスクトップ開発、.NETデスクトップ開発をインストールしておきます。

f:id:shiratori00:20200713015538p:plain

 

以下の設定でプロジェクトを作成する

f:id:shiratori00:20200706231830p:plain

 

プロジェクトを作成したら、下記のプラグインをダウンロードして、Pluginsフォルダを作ってそこに入れます。

github.com

立ち上げる前に、uprojectファイルを右クリックからGenerateVisualStudioProjectFilesをやっておきます。

 

起動したらAugumentedRealityのHololens、VirtualRealityのMicrosoftWindowsMixedRealityにチェックを入れて再起動する。

f:id:shiratori00:20200706231605p:plain

f:id:shiratori00:20200706231609p:plain

レベルをEmptyLevelで作ります。

ARSessionConfigを作ります。

f:id:shiratori00:20200711003919p:plain

 

f:id:shiratori00:20200711003937p:plain

ブループリントでGameModeとPawnを作成して、GameModeのBeginPlayとEndPlayでARSessionの開始と終了処理を追加します。

 

f:id:shiratori00:20200711004114p:plain

 

作ったプレイヤークラスをデフォルトプレイヤーに設定します。

WorldSettingで作成したGameModeを設定します。

以上で必要な構築は終わりです。

 

次にデバッグの方法です。実機デバッグの仕方は主に2つです。

・パッケージ化して、DevicePortalから実機へデプロイして動かす

・HolographicRemotingを利用してPCから遠隔で起動する。

 

それぞれのメリットデメリットを記載します。

パッケージ化

メリット

・実際のアプリケーションの動作と同じ動作をする(当然ですけど

 

デメリット

・パッケージ化→デプロイの工程にそこそこ時間がかかる上に、Editor単体でどうにもならないので面倒くさい

 

HolographicRemoting

メリット

・簡単。VRPlayボタンを押すだけで速攻で起動できる。

 

デメリット

・そこそこ重い処理をしたりするとHololens2側で描画が消える。(空間マッピングワイヤーフレーム表示とかするとほとんど描画できなかったり)

 

それぞれの使い方としては、

パッケージ化:アプリの全体を通してのデバッグ等。HolographicRemotingでは描画されなくてどうしようもない場合

HolographicRemoting:テスト的に実装した機能をぱぱっと試したいとき

 

基本的にはHolographicRemotingでデバッグしてある程度まとまってきたらパッケージ化の流れで問題ないと思います。

 

やり方は下記にまとめてある公式ページがあるのでそちらを参照してください。

docs.unrealengine.com

 

docs.unrealengine.com

 

ここから各種機能の使い方をまとめます。

 

手の追跡

UXToolsプラグインのUxtHandInteractionActorを利用します。

 

これを使えば、対象のアクターにGenericManipurateコンポーネントをつけるだけで、物をつかんで移動、大きさ・回転の変更などのアクションを楽に行えます。 

f:id:shiratori00:20200710211739p:plain

UxtHandInteractionActorを生成する

 

BlueprintのInputAction/Axisを使う場合、MotionControllerを追加することと、CaptureGesturesであらかじめ取得するジェスチャーを設定しておく必要がある。

f:id:shiratori00:20200710232705p:plain

コンポーネントにMotionControllerの追加とCaptureDevicesの実行

f:id:shiratori00:20200711101934p:plain

Windows Spatial Input系列がHololens2のジェスチャーイベント

TapイベントはRelease時のみ反応

DoubleTapイベントはRelease時のみ反応。また、一回目のタップでTapイベントが反応

HoldはPress・Release両方に対応

ManipurationとNavigationは違いがよくわかんなかったです。Holdっぽい状態から手を動かすと反応しました。詳細がわかる人はだれか教えてください。もしくはわかったら追記します。

 

GenericManipurateコンポーネントを付けるとそのアクターの移動や回転ができます。

また、片手と両手でのアクターの操作方法も決められます。

f:id:shiratori00:20200711102348p:plain

GenericManipurateコンポーネントの詳細画面

ManipurationModeが片手か両手かその両方かの操作方法を選択します。

OneHandRotationModeは片手でつかんだ際のアクターの回転についてです。片手の場合確実に手にくっついてきます。

下記に軽く動作させてみた感じの結果をまとめました。

-Maintain Original Rotation : 回転はつかんだ時のそのオブジェクトの回転を保持したまま動きます

-Rotate About Object Center : 手の回転に合わせてアクター。アクターの中心を軸として回転します。

-Rotate About Grab Point : 手の回転に合わせてアクターが、つかんだ位置を中心軸として回転する?(正直よくわからんかったですけど

-Maintain Rotation to User : ユーザーの回転に合わせてアクターが回ります。ここのユーザーの回転は頭の向きのことです。ロール回転は特に変化なかったですが、首を縦横に動かしたら動きました。

-Gravity Aligned Maintain Rotation to User : 上記との違いはよく分からんかったです。

-Face User : 必ずユーザーの方を正面にアクターが回転します

-Face Away From User : アクターがユーザーの位置から逆向きにの方向に回転します。

TwoHandTransformModesは、両手でつかんだ際の挙動に関してです。これに関しては、移動・回転・拡縮のそれぞれを有効にするかどうかを選びます。デフォでは全部動きます。

Smoothingはどれだけなめらかに手にくっついてきたり、回転などの変化がされるかの値です。ただし、0にすると動かなくなります。1以上にしておくととりあえずは動きますが、標準の100で問題ないでしょう。

 

簡単なボタンも用意されています。SimpleButtonというクラスを継承したBlueprintを作るとすぐに使用できます。

f:id:shiratori00:20200711013520p:plain

 

イベントについて。また、下記の表記で、

ポインタは人指し指が近づいたときと遠い時に出るレーザーポインタの両方を指してます。

指は、人差し指のことを指してます。

BeginFocus:ポインタがボタンに当たったとき

UpdateFocus:ポインタがボタンに当たり続けてるとき

EndFocus:ポインタがボタンがから離れたとき

BeginPoke:指がボタンに触れたとき

UpdatePoke:指がボタンに触れ続けているとき。UpdateFocusと重複して発生する

EndPoke:指がボタンから離れたとき

ButtonPressed:ボタンが押されたとき

ButtonReleased:ボタンが離されたとき

 

になります。見た目の変更はBaseが土台、MovingVisualsがピンク色のボタン部分になります。StaticMeshで用意してください。

 

パラメータに関してですが、

MaxPushDistance:指でボタンの押せる距離。長いほどボタンの押せる距離が長くなる。土台を突き抜けることも可能

Pressed Fraction:遠い時のポインタでボタンをタップして押した際にボタンがどこまで移動するか。PushDistanceの遠いポインタ版

Released Fraction:ちょっとこれよくわかんないです。リリース時になんか起きるのかなと思っていろいろ値を変えましたが特に結果が変わらなかったので・・・。

Recovery Speed:Push時にボタンが戻るスピード

 

Handデータを直接取りたい場合は下記の記事に詳細が載ってます。自分でも触ったら別途なんか記事書くと思います。

docs.microsoft.com

 

視線入力

設定としてProjectSettingsからPlatforms>Hololens>CapabilitiesのGaze Inputにチェックを入れてください。

f:id:shiratori00:20200711115312p:plain

アイトラッキングの権限の設定

 

実際にアイトラッキングの使用はGetGazeData関数を使います。

f:id:shiratori00:20200711115517p:plain

OutGazeDataはアイトラッキングの結果が入っている構造体のEyeTrackerGazeDataです

ReturnValueはアイトラッキングが正常にデータを取得できたかの返り値です。目を閉じていたり、ちゃんとかぶれていない場合にはfalseを返します。

 

EyeTrackerGazeDataの中身についてですが、

・GazeOrigin : 目線の開始位置

・GazeDirection : 目線の向き

・FlaxionPoint : 常に0

・ConfidenceValue : データの信頼性。基本1

 

空間マッピング

空間マッピングを利用するには、ARSessionConfigでGenerateMeshDatafromTrackedGeometryとGenerateCollisionforMeshDataにチェックを入れる。

f:id:shiratori00:20200712173025p:plain

空間とあたり判定をとるには、LineTracebyChannelやSphereTracebyChannelなどのTraceのあたり判定をとることができます。

f:id:shiratori00:20200713014805p:plain

あとは認識した空間のメッシュ等の情報が入っているTrackingGeometoryの取得などが公式ドキュメントにはまとめてあります。

docs.microsoft.com

空間オーディオ

空間オーディオを利用するには、PluginのMicrosoftSpatialSoundを有効化して再起動。

f:id:shiratori00:20200708232357p:plain

ProjectSettings>Platforms>Hololens>AudioのSpatializationPluginにMicrosoftSpatialSoundを設定

f:id:shiratori00:20200711193855p:plain

次に減衰オブジェクトを作ります。

f:id:shiratori00:20200711203959p:plain

作成した減衰オブジェクトの設定のAttenuationSpatialization>SpatializationMethodをBinauralに設定してください。

f:id:shiratori00:20200712154537p:plain

その他の減衰設定は公式のドキュメントを参照してください。ここでは詳細の解説は省きます。

docs.unrealengine.com

 

AudioComponentがついたActorを用意します。AudioComponentの設定から先ほど作成した減衰オブジェクトを設定します。

f:id:shiratori00:20200712172233p:plain

また、公式のドキュメントに書いてあるのですが、空間オーディオで鳴らす音はモノラルである必要があるので注意してください。

 

あとは、適当な位置に置くとその方向から聞こえるようになるはずです。

音声入力

ProjectSettings>Engine>Input>SpeechMappingsにキーワードとアクション名を設定することで普通にInputActionと同じように使えるようになります。

f:id:shiratori00:20200713012727p:plain

SpeechMappingsに名前と反応するキーワードを設定

f:id:shiratori00:20200713012807p:plain

設定した名前のInputActionが使えるようになる

適当にキーワードを入れて試してみましたが、日本語の単語は反応せず、英語の単語のみ反応しました。英語の単語であれば、キーワードがひらがなで入力してあっても反応しました。

ただ、自分の発音がダメダメすぎて反応率が悪かったので、あんまり検証しきれてないです。

 

 

 

残り、空間アンカーとカメラとQRコードは検証不足なので、後日追記するか別記事でまとめるなりします。