仮想と物理とエトセトラ

xRや物理とかごった煮の備忘録的技術ブログ

UE4でHoloLens2に豆腐を表示する

今回は久々にUnreal Engineの記事です。
前回:

xr-physics-work-etc.hatenablog.com

最近Unreal Engine 5が正式リリースされましたが、まだMRTKが対応していなかったり、マーケットプレイスで取得したMicrosoft OpenXRではパッケージ作成時にエラーが出たりするため、今回はUnreal Engine 4.27での豆腐表示を試します。
公式ドキュメントもあったりしますが、あくまで自分用の備忘録としてまとめておきます。

docs.unrealengine.com

前提

Unreal Engine 4.27.2

準備

Microsoft OpenXRの取得

HoloLens2でOpenXRを使用するために、マーケットプレイスからMicrosoft OpenXRを取得します。
「アセットを検索」から「Microsoft OpenXR」を検索すると目的のアセットが表示されます。
「無料」ボタンを押してアセットを取得した後、「エンジンにインストール」から4.27.2のUnreal Engineを選択してインストールします。

ビルド用設定の準備

まずはUnreal EngineでHoloLens用にビルドできるようにします。
Engineバージョンの「4.27.2」の下向き三角をクリックするとメニューが表示されます。
表示されたメニューから「オプション」を選択します。

インストールオプションから、「対応プラットフォーム」にHoloLens2を追加します。
HoloLens2の項目にチェックを入れ、「適用」ボタンを押します。

HoloLens2向けビルドツールのダウンロード/インストールが始まるので、しばらく待つとインストールが終わります。

プロジェクトを作る

次に、Unreal Engineを起動してプロジェクトを作成します。
4.27.2のバージョンのUnreal Engineを選択し、「起動」ボタンを押します。

Unreal Engineが起動したら、新規プロジェクトのテンプレートを選択します。
まずは「ゲーム」を選択し、「次へ」を選択します。

次に「Blank」を選択し、「次へ」を選択します。

次にプロジェクトの詳細設定を行います。
今後のため、C++も使用できるように「C++」を設定します。
端末種別は「モバイル/タブレット」、パフォーマンス特性は「スケーラブルな3D・2D」、「スターターコンテンツなし」、「レイトレーシング無効」を選択します。
プロジェクト名と保存場所を設定し、問題なければ「プロジェクト作成」ボタンを押します。

プロジェクトの初期設定

プラグイン設定

プロジェクトが開いたら、初期設定としてプラグインを導入します。
上部メニューの「編集」→「プラグイン」からプラグインウィンドウを表示します。

検索ウィンドウで「hololens」と検索すると出てくる、「HoloLens」、「Microsoft OpenXR」プラグインの有効にチェックを入れ有効化した後、「今すぐ再起動」ボタンからエディタを再起動してプラグインを有効化します。

プロジェクト設定

次にプロジェクトの設定を変更します。
上部メニューの「編集」→「プロジェクト設定」からプロジェクト設定ウィンドウを表示します。

まずは「説明」の項目を変更します。
「プロジェクト名」にHoloLensでのアプリ名、「企業名」は任意の値、「企業識別名」にはCN=の後に企業名で入力した値を入力します。
「企業識別名」の値は、この後の「署名証明書」で使用します。
最後に「設定」項目の「VRで開始」にチェックを入れます。

次にプラットフォーム「HoloLens」の項目を確認します。
まず、「Build for HoloLens Device」の項目にチェックがついていることを確認します。
次に、「署名証明書」の新規作成ボタンを押します。

秘密鍵を作成するウィンドウが表示されます。
今回はパスワードを設定しないので、「None」を設定します。

正常に証明書が作成されると、さきほど「説明」で設定した「企業識別名」が表示されます。

これでプロジェクト設定ができました。

レベルの設定

レベル初期設定

次にレベル(シーン)の設定を行います。
現在のレベルには不要なものが多いので新規でシーンを作成します。
上部メニューの「ファイル」→「新規レベル」から新しくレベルを作成します。
新規レベルウィンドウから「空のレベル」を選択します。

これで、まっさらなレベルが作成できます。
今のうちに作成されたレベルを保存します。
上部メニューの「ファイル」→「現在のレベルを保存」から保存できます。
「コンテンツ」ディレクトリ配下に「Maps」ディレクトリを作成し、その中に「Main」という名前でレベルを保存します。
各設定が終わったら「保存」ボタンからレベルを保存します。
これで空のレベルを保存できました。

豆腐を配置する

次にレベル中に豆腐を配置します。
「アクタを配置」から「基本」→「キューブ」を選び、ドラッグアンドドロップでビューポート中に配置します。
位置、姿勢は下記を参考に設定します。

次に光源を設定します。
「ライト」→「ディレクショナルライト」をドラッグアンドドロップでビューポート中に配置します。
位置、姿勢は下記を参考に設定します。

これで豆腐を配置できました。

HoloLens用設定をする

次にHoloLens用にプロジェクトを構成します。

AR Session Config

コンテンツブラウザで右クリックし、「その他」→「データアセット」を選択します。

データアセット選択ウィンドウが表示されるため、「ARSessionConfig」を選択します。
データアセット名も「ARSessionConfig」とします。

次に、ARSessionConfigを有効化するため、レベルブループリントに設定します。 「ブループリント」→「レベルブループリントを開く」をクリックします。

レベルブループリントを設定します。
イベントBeginPlay(起動時に実行されるイベント)にStart AR Sessionを設定し、Session Configに先ほど作成したARSessionConfigを設定します。

Start AR Sessionは右クリックすると見つかるノードです。

イベント EndPlayStop AR Sessionも同様に設定します。
保存後、「コンパイル」ボタンから再コンパイルを行います。

これでAR Sessionの設定ができました。

ポーン、ゲームモードベースを設定する

次にポーンとゲームモードベースを設定します。
ポーンはプレイヤーを表す実体、ゲームモードベースはゲームモードの基本クラスです。
docs.unrealengine.com

docs.unrealengine.com

ポーンを作成するため、コンテンツ配下に「Blueprints」フォルダを作成し、右クリックをします。
右クリック後、「ブループリントクラス」を選択します。

「親クラスを選択」ウィンドウで下部の「すべてのクラス」からdefaultPawnを検索し、選択します。

DefaultPawnを親クラスとして設定したポーンを作成できるので、名前を設定します。
今回はxR_Pawnとしました。

作成したxR_Pawnをダブルクリックし、ウィンドウを開きます。
コンポーネントを追加」からcameraを検索し、カメラコンポーネントを追加します。

Collision ComponentMesh Componentコリジョンの設定をNoCollisionに設定します。

設定が終わったらコンパイルを実施し、保存します。

次にゲームモードベースを作成します。
コンテンツブラウザ中で右クリックし、ブループリントクラスを選択します。

「親クラスを選択」ウィンドウから「すべてのクラス」でGameModeBaseを検索し、選択します。
ブループリントの名前はxRGameModeBaseとしました。

作成したxRGameModeBaseをダブルクリックし、右の詳細ウィンドウを編集します。
Default Pawn Classに先ほど作成したxR_Pawnを設定します。

設定したらコンパイルを実行し、保存します。
最後に、「編集」→「プロジェクト設定」を開き「マップ&モード」を開きます。
ゲームモードには、xRGameModeBaseを、マップにはMainを設定します。

パッケージを作成する

最後にプロジェクトからパッケージを作成します。
「ファイル」→「プロジェクトをパッケージ化」→「HoloLens」を選択します。
パッケージを保存する場所を選び(多くはBuild配下)決定すると、パッケージ化が開始されます。

パッケージ化が成功すると、先ほど出力先に指定したディレクトリにアプリパッケージが作成されます。
Device PortalからインストールすることでHoloLensでアプリが使用できるようになります。

docs.microsoft.com

動作確認

作成したアプリパッケージを実機で動かしてみました。
問題なくお豆腐が表示されています。

影の表現が真っ黒なため、実機だと透明に見えてしまっています。対応が必要そうです。
次回以降は、UnrealEngineのMRTKを触ってみようと思います。

docs.microsoft.com