先日、Oculus改めMeta Quest Proが発表された。
今回はさすがに価格が高過ぎて手が出せない。Oculus Meta Quest 2を購入してからもう2年経つ。
併せて購入したEliteストラップは早々に割れてしまった。
今はZBrushで作り途中の3DモデルをQuest 2に持って行って立体視で確認する使い方をしている。
3Dモデルの確認に使用しているのはQuest 2で動くGravity Sketchというアプリ。
ZBrushからDecimation Masterでポリゴン数を削減(デシメーション率は5%に設定)した3DモデルをOBJファイルにエクスポートして、OBJファイルをLanding Pad経由でQuest 2のGravity Sketchに持って行って立体視で3D形状を確認している。
作り途中のものをZbrushのDecimation Masterでポリゴン数削減してOBJ形式にエクスポートすれば、Oculus Quest2のGravity Sketchを使って3Dで形状を確認できることを知った。
データ変換して持って行く手間はかかるけど、いちいち3Dプリントしてバランスを確認するより断然楽。#Zbrush #ガメラ pic.twitter.com/jyiq4dX96M— NegativeMind (@NegativeMind) February 6, 2021
しかし、この確認方法に少し不満も感じ始めている。
Gravity Sketchは基本的にモデリングツールなので、コントローラーで3D空間にポリゴンMeshを追加していく操作が軽快に処理できるよう、レンダリング品質はかなり低くめになっている。このレンダリング品質は形状確認用途にはちょっと物足りない。形状を確認できるほど陰影や影がキチンと描画されないのだ。
ZBrushで作ったハイポリのモデルをGravity Sketchで表示中に操作をミスってポリゴンMeshを追加してしまうと、アプリの動画が急に重くなって何もできなくなってしまう。その度にアプリを再起動してやり直している。変な話だが、Gravity Sketchのモデリング機能が邪魔だ。
ということで、ZBrushで制作中のモデルをHMDで確認する用途だけに特化したVRアプリを自分で作りたくなってきた。(GoやQuest 2を持っていながら自前のVRアプリを作っていなかったのも不思議な気はする)
UnityでQuest 2向けアプリを作る
盛り込みたい機能やアプリの方針を整理してみた↓
目標設定
モデリング等の余計な機能は入れず、3Dモデルの形状確認に特化する
この目標をもう少し具体的に分解してみると…
- サーフェイサーを吹いて軽く墨入れしたような見た目で3Dモデルを表示する
- 3Dモデルを自由な方向から観察できる
- 背景は簡素(上下が分かる程度)
といったところか。VRアプリ開発経験が乏しいのであんまり厳密にならず作りながら方針を修正していくことになると思う。
スポンサーリンク
開発環境
Unity 2021.3.11f1を使ってアプリを作っていく。よく分からないのでとりあえずVRテンプレートを使ってプロジェクトを作成↓
こちらやこちらを参考にすると、Quest 2アプリを開発する場合はOculus Integrationというアセットを利用すれば良いらしい↓
Oculus Integrationに入っているOVRPlayerControllerというprefabをsceneに配置すれば立体視の設定は完了。
URPにして、sceneにとりあえずアヴァン・ガメラのモデルを配置。背景のSkyBoxにはHorizontal Skybox Shaderを使用して、グラデーションで何となく上下の方向が分かる感じにしておく↓
Quest 2向けにビルドしてQuest 2実機で動作確認することもできるけど、PCとQuest Linkで接続していればUnityのPlayボタンを押すだけでQuest 2で確認できる。PC VRでの動作になっちゃうのでQuest 2のスペックでのパフォーマンスは確認できないけど、パフォーマンスチューニングはまだだいぶ先の話だ。
iOS向けのビルドの手間に比べればQuest 2(Android)向けのビルドもそんなに手間と感じないけど。
ここまで、結局Metaの公式ドキュメントはあまり参考になってないな(笑)
https://developer.oculus.com/documentation/unity/unity-tutorial/?locale=ja_JP
https://developer.oculus.com/documentation/unity/ts-odh/?locale=ja_JP
Oculus Developer Hubってのはつまり何なんでしょう?
トラブルシューティング
Playしたら視点が落下し続けてしまう現象に遭遇。
OVRPlayerControllerにアタッチされているOVRPlayerController.csのGravitiy Modifierというパラメータを0にしておかないと、重力の影響で落下してしまうらしい。今回は床のオブジェクトとColliderを用意していないので無限に落ち続けていたようだ。
Skyboxが右目だけ描画されない現象に遭遇。立体視用にShaderを修正する必要があるらしい。
https://redhologerbera.hatenablog.com/entry/2022/01/31/212231
元のShaderをフォークして修正した↓
https://github.com/NegativeMind/UnitySkyboxShaders
現状
現状をOculusMirror Compositor Mirrorで録画してみた↓
ZBrushで作ったものをHMDで確認するためだけのシンプルなVRアプリを作り始めた。
機能を絞る代わりに造形が確認しやすいレンダリング品質を優先するつもり。#unity3d #Quest2 pic.twitter.com/IOl1vDGwgf— NegativeMind WIP (@NegativeMindWIP) October 15, 2022
まだ3DモデルがY軸回転するだけの状態です。
これからやりたいこと
- OBJファイルをランタイム中にロードする→Runtime OBJ Importerが使えそう
- 3Dモデルの初期配置・スケールを自動調整して、必ず目の前に30cm程度のサイズで表示する
- 3Dモデルをコントローラーで移動・回転・スケールできるようにする→コントローラーを表示する
- ライトの方向もコントローラーで操作できるようにする?
Quest 2単体で動作するアプリだとしたら、どうやってOBJファイルを持って行くか悩みどころ。PC VR前提であればPC側でOBJファイルをアプリにドラッグアンドドロップするとかかな? クラウドストレージが利用できるとスマートだけど、どうやって実装したらいいのか分からない。
パフォーマンスチューニング
動作を少しでも軽くしたいので、3DモデルのSubMeshを全て結合してtransformを減らす
https://ekulabo.com/unity-combine-meshes
https://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html
このVRアプリの開発記事まとめページ↓
スポンサーリンク