【UE4】Hololens2開発まとめ
Hololens2買いました。
Hololens2、お前は七夕に来る予定では? pic.twitter.com/EgsLB8XGwj
— 白鳥隆士 (@shiratori1221) 2020年7月4日
なので、UE4での開発について公式のドキュメントの内容をまとめておきます。
UE4のバージョンは4.25.1で試してます。4.24以前だと使えないプラグインがあるので気を付けて下さい。
参考元は以下にまとめます。
Microsoftの公式ドキュメント。基本的にHololens2の機能の実装の仕方自体はこっちにしか載ってないので注意。
Epicの公式ドキュメント。ストリーミングとパッケージングの仕方だけ載ってる。
環境構築ですが、EpicGamesLauncherで4.25.1をダウンロードして、オプションでHololens2をダウンロードします。
インストールが終わったら、日本語環境限定でエンジンソースに手を入れる必要があります。
Epic Games/UE_4.25/Engine/Source/Runtime/Core/Public/Misc/Char.h
の中身のコメントを全部消して上書き保存してください。
VisualStudioInstallerでUniversalWindowsプラットフォーム開発、C++デスクトップ開発、.NETデスクトップ開発をインストールしておきます。
以下の設定でプロジェクトを作成する
プロジェクトを作成したら、下記のプラグインをダウンロードして、Pluginsフォルダを作ってそこに入れます。
立ち上げる前に、uprojectファイルを右クリックからGenerateVisualStudioProjectFilesをやっておきます。
起動したらAugumentedRealityのHololens、VirtualRealityのMicrosoftWindowsMixedRealityにチェックを入れて再起動する。
レベルをEmptyLevelで作ります。
ARSessionConfigを作ります。
ブループリントでGameModeとPawnを作成して、GameModeのBeginPlayとEndPlayでARSessionの開始と終了処理を追加します。
作ったプレイヤークラスをデフォルトプレイヤーに設定します。
WorldSettingで作成したGameModeを設定します。
以上で必要な構築は終わりです。
・パッケージ化して、DevicePortalから実機へデプロイして動かす
・HolographicRemotingを利用してPCから遠隔で起動する。
それぞれのメリットデメリットを記載します。
パッケージ化
メリット
・実際のアプリケーションの動作と同じ動作をする(当然ですけど
デメリット
・パッケージ化→デプロイの工程にそこそこ時間がかかる上に、Editor単体でどうにもならないので面倒くさい
HolographicRemoting
メリット
・簡単。VRPlayボタンを押すだけで速攻で起動できる。
デメリット
・そこそこ重い処理をしたりするとHololens2側で描画が消える。(空間マッピングのワイヤーフレーム表示とかするとほとんど描画できなかったり)
それぞれの使い方としては、
パッケージ化:アプリの全体を通してのデバッグ等。HolographicRemotingでは描画されなくてどうしようもない場合
HolographicRemoting:テスト的に実装した機能をぱぱっと試したいとき
基本的にはHolographicRemotingでデバッグしてある程度まとまってきたらパッケージ化の流れで問題ないと思います。
やり方は下記にまとめてある公式ページがあるのでそちらを参照してください。
ここから各種機能の使い方をまとめます。
手の追跡
UXToolsプラグインのUxtHandInteractionActorを利用します。
これを使えば、対象のアクターにGenericManipurateコンポーネントをつけるだけで、物をつかんで移動、大きさ・回転の変更などのアクションを楽に行えます。
BlueprintのInputAction/Axisを使う場合、MotionControllerを追加することと、CaptureGesturesであらかじめ取得するジェスチャーを設定しておく必要がある。
TapイベントはRelease時のみ反応
DoubleTapイベントはRelease時のみ反応。また、一回目のタップでTapイベントが反応
HoldはPress・Release両方に対応
ManipurationとNavigationは違いがよくわかんなかったです。Holdっぽい状態から手を動かすと反応しました。詳細がわかる人はだれか教えてください。もしくはわかったら追記します。
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を作るとすぐに使用できます。
イベントについて。また、下記の表記で、
ポインタは人指し指が近づいたときと遠い時に出るレーザーポインタの両方を指してます。
指は、人差し指のことを指してます。
BeginFocus:ポインタがボタンに当たったとき
UpdateFocus:ポインタがボタンに当たり続けてるとき
EndFocus:ポインタがボタンがから離れたとき
BeginPoke:指がボタンに触れたとき
UpdatePoke:指がボタンに触れ続けているとき。UpdateFocusと重複して発生する
EndPoke:指がボタンから離れたとき
ButtonPressed:ボタンが押されたとき
ButtonReleased:ボタンが離されたとき
になります。見た目の変更はBaseが土台、MovingVisualsがピンク色のボタン部分になります。StaticMeshで用意してください。
パラメータに関してですが、
MaxPushDistance:指でボタンの押せる距離。長いほどボタンの押せる距離が長くなる。土台を突き抜けることも可能
Pressed Fraction:遠い時のポインタでボタンをタップして押した際にボタンがどこまで移動するか。PushDistanceの遠いポインタ版
Released Fraction:ちょっとこれよくわかんないです。リリース時になんか起きるのかなと思っていろいろ値を変えましたが特に結果が変わらなかったので・・・。
Recovery Speed:Push時にボタンが戻るスピード
Handデータを直接取りたい場合は下記の記事に詳細が載ってます。自分でも触ったら別途なんか記事書くと思います。
視線入力
設定としてProjectSettingsからPlatforms>Hololens>CapabilitiesのGaze Inputにチェックを入れてください。
実際にアイトラッキングの使用はGetGazeData関数を使います。
OutGazeDataはアイトラッキングの結果が入っている構造体のEyeTrackerGazeDataです
ReturnValueはアイトラッキングが正常にデータを取得できたかの返り値です。目を閉じていたり、ちゃんとかぶれていない場合にはfalseを返します。
EyeTrackerGazeDataの中身についてですが、
・GazeOrigin : 目線の開始位置
・GazeDirection : 目線の向き
・FlaxionPoint : 常に0
・ConfidenceValue : データの信頼性。基本1
空間マッピング
空間マッピングを利用するには、ARSessionConfigでGenerateMeshDatafromTrackedGeometryとGenerateCollisionforMeshDataにチェックを入れる。
空間とあたり判定をとるには、LineTracebyChannelやSphereTracebyChannelなどのTraceのあたり判定をとることができます。
あとは認識した空間のメッシュ等の情報が入っているTrackingGeometoryの取得などが公式ドキュメントにはまとめてあります。
空間オーディオ
空間オーディオを利用するには、PluginのMicrosoftSpatialSoundを有効化して再起動。
ProjectSettings>Platforms>Hololens>AudioのSpatializationPluginにMicrosoftSpatialSoundを設定
次に減衰オブジェクトを作ります。
作成した減衰オブジェクトの設定のAttenuationSpatialization>SpatializationMethodをBinauralに設定してください。
その他の減衰設定は公式のドキュメントを参照してください。ここでは詳細の解説は省きます。
AudioComponentがついたActorを用意します。AudioComponentの設定から先ほど作成した減衰オブジェクトを設定します。
また、公式のドキュメントに書いてあるのですが、空間オーディオで鳴らす音はモノラルである必要があるので注意してください。
あとは、適当な位置に置くとその方向から聞こえるようになるはずです。
音声入力
ProjectSettings>Engine>Input>SpeechMappingsにキーワードとアクション名を設定することで普通にInputActionと同じように使えるようになります。
適当にキーワードを入れて試してみましたが、日本語の単語は反応せず、英語の単語のみ反応しました。英語の単語であれば、キーワードがひらがなで入力してあっても反応しました。
ただ、自分の発音がダメダメすぎて反応率が悪かったので、あんまり検証しきれてないです。
残り、空間アンカーとカメラとQRコードは検証不足なので、後日追記するか別記事でまとめるなりします。