Unreal EngineにおけるHMDの視点を操作する方法

 本投稿は,Unreal Engine(UE)において,HMDを用いた場合のカメラの親子構造の説明と,HMDの視点を操作する方法に関する投稿です.
  使用しているUEのバージョンは4.25.4です.

目次

  1. 結論:カメラにおけるコンポーネントの親子関係
  2. 確認方法
  3. ノードの接続方法の違いによって生成されるコンポーネント ノードの違い

1. 結論:カメラにおけるコンポーネントの親子関係

 実行時の視点として設けたカメラに対し,HMDを接続した際の各コンポーネントの親子関係は図1および表1のようになっているようです.
 そのため,HMDを装着した者による実空間での移動量や回転量とは別に,UE内でのカメラの座標を変更したいとき(例えば,UE内で車両に乗って移動する際など)は,カメラ アクタのRootComponentのLocationやRotationを変更する必要があります.

図1  カメラにおけるコンポーネントの様子
表1 各コンポーネントの座標が示す値
コンポーネント

座標の内容

RootComponent カメラ アクタの原点を示します
SceneComponent RootComponentと同じ値を示します.そのため,現時点で筆者にはRootComponentとの違いが分かっていません
HMD HMDを装着した者による実空間での移動量や回転量のみを示します
CameraComponent RootComponentとHMDの移動量や回転量のそれぞれの加算値を示します

2. 確認方法

 この第2章では,前述1章の内容に対し,どのように確認したかその方法について説明します.
 図2はレベルのブループリントです.CameraActorは,レベルに設けたカメラ アクタです.「GetOrientation and Position」ノードは,HMDのRotationとLocationを求められるノードです.
 そしてCameraActorのLocationを「SetWorldLocation」ノードとPCからの手動操作で変更し,各コンポーネントが実際に示すLocationの座標を「PtintString」ノードで確認しました(図3).手動操作で操作する座標は,カメラのRootComponent,SceneComponent,CameraComponentそれぞれに対し行い,各場合における挙動を実地に確認しました.
 CameraComponentの値は,処理の順序や処理時間によるものかわずかな違いはありますが,おおよそRootComponentとHMDの加算値になっていました(図3).

図2 レベルのブループリント
図3 実行結果(RootComponetを手動操作した場合)

3. ノードの接続方法の違いによって生成されるコンポーネント ノードの違い

 カメラ アクタのアウトプット ピンから「GetWorldLocation」ノードを検索すると,カメラ アクタと 「GetWorldLocation」ノードを仲介するノードとして,CameraComponentかSceneComponentの2種類だけが候補として表示されます(図4).
 しかし,カメラ アクタと既に用意しておいた「GetWorldLocation」ノードとを接続すると,自動で生成されるコンポーネント ノードはRootComponentになります.これは「GetWorldLocation」ノードだけでなく「SetWorldLocation」ノードでも同じ挙動をします.そして「SetWorldLocation」 でカメラ アクタの座標を操作する際にCameraComponentを用いてしまうと,親に当たるHMDの視点は操作の影響を受けず,意図した視点の操作が反映されない状態になってしまいます.

図4 カメラ アクタから「GetWorldLocation」ノードを検索した場合