Godot Engine VR開発メモ(Quest、Steam VR、WebXR対応)
最終更新日:2022年04月25日
オープンソースのゲームエンジンGodotでVR開発をする方法やTipsをメモする場所です。

更新履歴
(2022年4月6日)OpenXRでVSYNCをオフにするのを追加
(2022年3月31日)「Androidエディタについて」を追加
(2022年3月28日)Godot 4のノード名とAPIについて追記
(2022年3月26日)Godot 4について追記、WebXRの使用方法を再確認、OpenXR PluginとGodot XR Toolsについて追記、レガシーな記述をいったん全部削除、「Meta社の支援について」を追加
(2021年7月7日)ページ公開
GodotのVR対応の基本
GodotにはVR対応のための仕組みが標準で備わっています。ドキュメントのこちらにVR関連機能の解説やチュートリアルがまとまっています。
シーンにARVROrigin、ARVRCamera、ARVRControllerでカメラとモーションコントローラーのリグを組み、スクリプトのARVRServer.find_interfaceで対応するプラットフォームのモジュールをロードし、get_viewport().arvr = trueでビューポートのVR描画を有効にするのが概ね共通する手順になります。
PC・Questで動作するVRアプリを作るには
2022年3月現在、主要なVRヘッドセットはすべてKhronosのOpenXR規格に対応しつつあります。QuestやOculus Link、Steam VRで動作するアプリを作るにはOpenXRを使用します。
Godot 3の場合
新規プロジェクトを作成し、AssetLibを開いて「OpenXR Plugin」をインストールしてください。3D sceneを作成し、Instance Child Sceneでアドオンに入っているaddons/godot_openxr/scenes/first_person_controller_vr.tscnを生成します。
シーンを保存して右上の再生ボタンを押すか、Windows Desktopでエクスポートして実行すると、現在アクティブなOpenXRランタイムのヘッドセットで見ることができます。
なお、Project Settings > General > Display > WindowでUse Vsyncをオフにしないとフレームレートが出ないようです。
Quest実機にエクスポートするには
QuestアプリとしてエクスポートするにはAndroid Studioのインストール等の環境設定が必要です。「Godot Engineメモ」を参照してください。
- Androidのエクスポート設定でXr ModeをOpenXRに設定します。
- プロジェクトをGLES2にする必要があります(ウィンドウ右上で変更できます)。
- Project Settings > Rendering > Vram CompressionでImport Etcをオンにします。
Godot 4の場合
現在アルファ版のGodot 4ではOpenXRモジュールがエンジン本体に統合され、Godot 3までのOpenXR Pluginは使用しません。Godot 4でOpenXRを使用するデモプロジェクトがあります。
ノード名とAPIがXROrigin3D、XRCamera3D、XRController3D、XRServer、get_viewport().use_xr等に変更されています。
Multiviewレンダリングに対応しているとのことです。
Godot 4.0 alpha 6現在、デスクトップのみに対応しており、QuestはMetaのOpenXRローダーの対応待ちとのことです。また、HTML5ターゲットが動作せず、対応がだいぶ先になりそうなためWebXRでの使用を想定している場合はGodot 3に留まったほうがよさそうです。
SDFGI等の高機能なレンダリング機能はまだステレオレンダリングに対応していないようです。
トラッキングについて、ルームスケールと着座を切り替えたい場合、Project Settings > General > XR > OpenXR > ReferenceSpaceに設定があります。
ブラウザで動作するVRアプリを作るには
Godot 3.3からWebXRモジュールが標準で含まれています。Godot 4はまだWebGLに対応していませんので、Godot 3を使用します。
WebXRモジュールを開発したDavid Snopek氏のページに詳細な解説が書かれていますが、以下、必要最小限の手順のメモです。
シーンを作成する
Godot 3で新規プロジェクトをOpenGL ES 2.0で作成し、以下の要領でVRのカメラリグを作成します。
- Create Root Nodeで3D Sceneを作る
- ルートSpatialの子にARVROriginノードを追加する
- ARVROriginノードの子にARVRCameraノードを追加する
- ARVROriginノードの子にさらにARVRControllerノードを2つ追加して、名前を「LeftController」「RightController」に変更し、InspectorでController Idをそれぞれ1と2に設定する
- モーションコントローラーが表示されるようにARVRControllerノードの子に適当なノードを追加する(例えば MeshInstanceを追加してMeshをNew CubeMeshにしてTransformのScaleを(0.1, 0.1, 0.1)にする)
初期化用のスクリプトを追加する
ルートのSpatialノードでスクリプトの追加ボタンを押して、David Snopek氏のページの中程にあるスクリプトをコピペします。
VRモードに入るための UI を作成する
ブラウザでVRモードに入るためのボタンを作ります。Spatialの子にButtonノードを作成し、Buttonのサイズを適当に設定して、Textに適当に「Enter VR」と入力します。
プロジェクトのエクスポート(ビルド)
作成したシーンを保存して、右クリックのSet As Main Sceneでメインシーンに設定します。Project > Export…でAdd…でHTML5を追加して(必要ならプロジェクトテンプレートをダウンロードして)Export Projectします。
ローカルHTTPSサーバーでホストする
WebXR Device APIはHTTPSサーバーでなければ動作しません。ウィンドウ右上のHTML5ボタンのRun in Browserで実行するには、Editor > Editor Settings…のExport > WebでUse Sslをオンにしておきます(ブラウザが開いたときに警告が出ますが無視してアクセスします)。
また、ローカルHTTPSサーバーを簡単に立てるにはBrowsersyncが便利です。npmでBrowsersyncをインストールして、プロジェクトがエクスポートされたディレクトリで下記を実行してください。
$ browser-sync start -–server –-https –-no-open -–port=1000
ブラウザで実行する
表示されたURLをブラウザで開きます。Questのブラウザで開く場合は、アドレスバーに「https://192.168..:1000/」とhttpsから全部入力する必要があります。「Enter VR」ボタンをクリックすると、上手くいけばVRモードに切り替わるはずです。
コントローラー入力を行うには
φ(..)メモメモ
OpenXRとWebXR両対応アプリを作るには
調べる予定
Godot XR Tools
AssetLibからインストールできるGodot XR Toolsに、テレポート、移動・回転、物を持つ・投げる、UIを操作する、酔い抑制のため視界を狭くする等の基本機能が入っています。UnityのXR Interaction Toolkitに相当します。
Godot Oculus Quest Toolkit
Godot Oculus Quest Toolkitというツールキットがあります。Questと名前がついていますがQuest以外でも使えるようです。
Meta社の支援について
GodotはMeta社のReality Labsから開発支援を受けています。
- Godot Engine - Godot Engine receiving support funded by Facebook Reality Labs
- Godot Engine - Godot Engine receiving a new grant from Meta’s Reality Labs
2021年12月の支援について、XRサポートの開発継続、Oculusの新機能対応、Godotのエディタそれ自体のXR対応といった方向性が示されています。ヘッドセットをかぶったままでシーン編集や開発ができるようにしたい、Quest単体で動くようにしたいとのことです(とても野心的で興味深いです)。
Androidエディタについて
Godot 3.5 beta 3でエディタがAndroidで動作するようになりました。Questにインストールしても動きます(Questは通常のAndroidアプリが2Dアプリとして動作します)。
