うさぎ開発まとめ(2022/2)

この記事は現在鋭意開発中のシングルプレイヤー専用VRエクスペリエンス「真夜中の雪うさぎ」の最近のようすを書いた記事です。で、あなたの恋が一体なんなんですか……?


開発環境について

前三作(と私が呼んでいる「1%の仮想」と「アスタリスクの花言葉」と「PROJECT: SUMMER FLARE」)はVRChatのワールドとして開発していましたが、今作は普通のVRゲームとしての開発となります。そんなわけで、ここしばらくはOpenXR+XR Interaction Toolkitでの開発方法についていろいろ勉強しつつ基礎的なレイヤーの実装を進めています。

OpenXRはSteamVRやOculusなどの特定の環境に依存せずにVR/AR/MR開発を行うことができる規格で、詳しいことを知りたい方はこんな記事を読むよりこりん神(@korinVR)の解説記事を読むほうがいいと思います。OpenXR+XR Interaction Toolkitは発展途上につきもろもろの対応が完全には整備されていないらしいのですが、本作についてはどうせ開発期間が延び延びになるのが目に見えているので、将来性を考えてこの開発環境を選定しています。


ロコモーション(移動方法)について

XR Interaction ToolkitではContinuous Move (Turn) Providerというスクリプトをペッと貼っ付けると(ジャンプは自分で実装する必要がありますが)ぶいちゃライクなロコモーションがすぐに実現できます。しかし、前作の開発経験から言って、この操作方法だけで開発を行うと、動作確認のたびにヘッドセットをつけて外してを繰り返すのがハチャメチャに時間的・体力的負担になります。特に「ドア」のようなコントローラを使って動かす系のギミックは、動作確認自体が開発における律速段階になりえます。とくに体力消費がヤバい。

そんなわけで、「デスクトップモード」(WASDとマウスで移動・視点移動)と「擬・VRモード」も実装しました。後者はVRモードのうちHMDの制御のみをデスクトップモードに切り替えるモードで、トラッキング空間におけるHMDの位置をPCのモニタ前に固定する1ことで手だけをVRコントローラで操作することができます。とくにぶいちゃ式ロコモーションは普通のFPSのバインド(WASD+マウス)と左右の手の機能が一致しているため、左手だけコントローラとか、右手だけコントローラとか、両手ともコントローラとかもごく自然に使用できます。これは実際に使ってみるとメチャクチャ新感覚&便利で、手をわちゃわちゃ動かす系のギミックのデバッグは正直これがないとやってられないです。ただし、モニタで見ると遠近感が全くつかめなくなるので、オブジェクトを持とうとしてスカることが頻発します。


オブジェクトの把持について

持つことのできるオブジェクト(XR Interaction ToolkitにおけるGrab Interactable、VRChatでいうPickup)をいい感じに持てる機能も作ってみました。というのも、VRChatのPickupではオブジェクトがたかだか1点(”Exact Gun”や”Exact Grip”)でしか持てなかったり、もしくはどこでも持ててしまって手にめり込んだりと快適な操作が損なわれるのをつくづく不満に思っていたからです2。この実装はオブジェクト内に置かれたアンカーと手のひらの姿勢からアンカーごとのペナルティをそれっぽく計算して、ペナルティが最小となるような箇所で持つという簡単な手法をとっています。アンカーについては位置と回転の自由度に応じていろいろな種類を実装しているので、(上の動画では「位置固定・角度4方向」しか使っていませんが)棒でも球でも複雑な形状でも好きな箇所をいい感じにつかめるようになっています。端を把持

把持中の指の姿勢については適当にレイを飛ばしてmuscle値を設定しています。ちなみに、これを書くために自分の指をまげまげしていて気づいたんですが、親指以外の指って根元から数えて第二関節と第三関節が常にほぼ同じ角度だけ曲がるんですよね。この近似を使うとそれぞれの指の曲げ伸ばし方向は二自由度になるので、指先を目標点に動かすためのmuscle値を簡単に計算することができます。

繊細な指の動きが要求されるオブジェクトの場合、オブジェクト特有の指アニメーションを使いたい場合があります3。この場合は前述のアンカーが便利で、アンカーにmuscleを上書きするようなパラメータを設けておくとごく自然にアニメーションを実現できます。


モデリング工程について

モデルを用意する工程もいろいろ試行錯誤しつつやっています。前作PSFでは、装飾用のオブジェクトやワールドマップは適当な繰り返しテクスチャを設定して、重要度の高いオブジェクトのみSubstance Painterを通すような工程で作っていました。ただ、今作では全部ある程度のクオリティで作りたいので、数十個の同じサイズ感のオブジェクトをまとめて1マテリアルを使用するように調整しています。こうするともちろん手戻り時のUV・テクスチャまわりの作業を最小化する必要があるので、文字などの細かいテクスチャ部分は別UV・別テクスチャで出すようにして、メインのUVはあとからいくらでも変更できるようにしています。

ちなみに、現時点でメッシュ数でいうと200個くらいは作っていて、最終的には1000とかいくんじゃないですかね。ヤバい。


カメラについて

カメラ、いいですよね。私自身は写真撮影の才がないのでVRChatなどで本格的な撮影はしていませんが、「現在のVRメタバース内で完結できる創作活動」のうち一番メジャーなものがカメラを使った撮影になるのではないかと思っています(例で言うとVRChatワールド探索部さんの記事など)。コントローラの自由度的にも、視覚的体験がメインであるVRというプラットフォーム的にも。

実は本作はこの「写真撮影」にもフォーカスしたいと思っていて()、他のVRソーシャルプラットフォームと同じように好きな時にカメラを手に取って写真を撮れる機能を実装する予定です。というか、もっととてもデカい要素のうちのほんの一部分がカメラ機能になるのですが、それはまたいずれ。

上のカメラのモデルはこのカメラ機能用に作ったものです。本作のUI実装担当(私)はVRChatのカメラのようなビームベースのUIが嫌いなので、手で直感的に操作できるようなカメラのUIをいろいろ考えています。上のものは向かって右側の取っ手でカメラをつかんで左のノブで機能(フィルターやフォーカス設定など)を操作するものになる予定です。なんとも珍妙な形状ですが、実際に手に持ってみるとスマホカメラを横置きで操作するときの手の動きとほぼ同じになるので、わりと直感的になると思います。そうだと思いたい。


  1. VIVEやIndexの場合、モニタ前でもトラッキングがまともに動くようにベースステーションの配置をうまいことする必要があります。
  2. 一応はUdonでちゃんと書けばそれなりに丁寧な調整は可能で、PSFでも細かい調整は入れていました。弁護すると、VRChatではアバターの自由度を高く保つためにわざとプリミティブな実装にとどめているのだと思います。たぶん。
  3. 厳密にやるならすべてのオブジェクトのすべての把持位置についてアニメーションを設定すべき(Alyxのコメンタリーでそんなくだりがあった気がする)なのですが、そんな工数は出せないので、ここはそれっぽく済ませます。