【VR】ド素人と始めるVR開発【Quest2】Part2 歩き回る、モノを掴む

[VR] Amateur with no development experience, start VR development [Oculus Quest2] Part 2 Walk around the office, grab things

category : 3D , Newnormal

人間、男、会社員。
説明書は読まないタイプ。
開発経験0の男、今回もOculus Quest2 + UnityでVR開発に挑戦していこうと思う。

前回この記事でOculus Quest2を使ってオフィスに降り立つことに成功した。


しかし、現状オフィス内を歩き回ることもできなければ(本当に歩き回ればVR空間でも移動することが可能なのだが、残念ながら物理空間には限りがある)何か物体に干渉することもできない。

このVR出勤をよりリッチな体験とするため、今回は歩行運動とモノを手に取る、投げるなどという行為を可能にしてみようと思う。


0.環境

—————————————————-
Windows10 使用しているPC
Oculus Quest2 ヘッドマウントディスプレイ。単独で動くし、PCと接続しても遊べる。
Android Studio v4.1.1 Androidの開発キット。QuestはAndroidベースなので。
Unity 2018.4.20f1 万能ゲーム開発エンジン。これでVRアプリも作れる。
Oculus Integration Version: 23.1  Oculus用の開発キット。Unityのプロジェクトに取り込む。
—————————————————-
私はオフィスのモデルを設置した前回のプロジェクトファイルを使って進めていくが、無い人はUnityの新規シーンにOculus Integrationをインポートし、[Assets]-[Create]-[3D Object]-[Plane]などで適当な足場でも作って進めてほしい。


1.移動の実装

せっかくVR空間に顕現することができたからには思いのままに空間を闊歩したい。
まずはコントローラーを用いて移動できるように設定してく。

コントローラーからの入力信号を受け取り、自分の座標を移動させていくコードを書いていく…というようなことをしなくても、どうやらOculus Integrationの中に簡単に実装できるprefabが用意されているらしい。
それが[OVRPlayerController]だ。

・OVRPlayerControllerの追加
前回は[OVRCameraRig]を追加することによりVR内での自分の視点を追加したことと思う。
今回はその代わりに、[OVRPlayerController]を追加する。
ProjectタブからAssets\Oculus\VR\Prefabsに入っている[OVRPlayerController]をHierarchyタブに放り込む。

この時点で既にVR空間を歩き回ることが可能となっている。
なんとも簡単に実装できてしまった。

[OVRPlayerController]の中身を見てもらうとわかると思うが、中には[OVRCameraRig]が含まれている。
コントローラーを表示させたい場合はこの下に前回同様の手順で追加することができるが、今回は次の手順でコントローラーの代わりにモノを掴める[手]を導入するためここでは実装しない。


2.モノを掴める手の設定

次は手の実装をしていく。
Oculus Integrationにはモノを握れるprefabが2種類用意されている。
一つは[OVR Grab]でもう一つはそれを拡張した[Distance Grab]である。
違いは[Distance Grab]は遠くのモノも引き寄せて手に取れるというもの。
今回はサンプルシーンが用意されていて分かりやすかった[Distance Grab]を利用する。

・手を装着
[Distance Grab]はAssets\Oculus\SampleFramework\Core\DistanceGrab\Prefabs\に入っている。
HierarchyタブのLeftControllerAnchor、RightControllerAnchorにそれぞれドラッグ&ドロップしよう。
DistanceGrabHandLeft.prefab
DistanceGrabHandRight.prefab

・手の設定
Hierarchyタブで追加した[DistanceGrabHand]を選択し、Inspectorタブで左右それぞれ設定を行っていく。

ひとまず動作させるために行った設定は以下の通りだ。

◎Hand(Script)の設定
 Controller:左[L Touch] 右[R Touch]
 Animator:左[l_hand_skeletal_lowres] 右[r_hand_skeletal_lowres]
 ※DistanceGrabHand下の階層にあるのでドラッグ&ドロップ

◎[Add Component]を押し[Distance]と入力すると出てくる[Distance Grabber]を選択→[Distance Grabber(Script)]の項目が追加される

◎Distance Grabber(Script)の設定
 GripTransform:[gripTrans]
 ※DistanceGrabHand下の階層にあるのでドラッグ&ドロップ
 Grab Volumes
  Size:[3]
  ※入力すると下のElementの項目が出てくる
  Element 0:[GrabVolumeCone]
  Element 1:[GrabVolumeBig]
  Element 2:[GrabVolumeSmall]
  ※DistanceGrabHand下の階層にあるのでドラッグ&ドロップ
 Controller:左[L Touch] 右[R Touch]
 Parent Transform:左[LeftHandAnchor] 右[RightHandAnchor]
 ※DistanceGrabHandの親の階層にあるものをドラッグ&ドロップ
 Player:[OVRPlayerController]
 ※一番親の階層からドラッグ&ドロップ

参考:https://developer.oculus.com/documentation/unity/unity-sf-distancegrab/?locale=ja_JP#distancegrabhandleft-and-distancegrabhandright-prefabs

細かい設定がズラッと並んだが、これで手側は設定できたはずだ。


3.掴む範囲の設定

モノにどのくらい近づいたら掴めるのかを設定する必要がある。
私はこれに気が付かず1時間近くの無駄に悩んだ。
[OVRPlayerController]の下に[GrabManager]を追加する。

・GrabManagerの設定

[OVRPlayerController]を右クリックし[Create Empty]する。
空のオブジェクトが出来るので、名前を[GrabManager]に変えておこう。

[Add Component]で2つのコンポーネントを追加する。
◎Sphere Collider
 Is Trigger:チェックする
 Radius:この範囲で調整した範囲にあるモノを掴むことができるようになる。
◎Grab Manager
 アウトラインの設定ができるシェーダーを使っていればフォーカスするとここで指定した色に変わるっぽい。今回は使っていないので変わらない。


4.掴まれるモノの設定

今度は物体を掴めるようにする設定だ。
まずは掴む対象のオブジェクトを追加する。
今回は元々設置してあった椅子と新たに設置した小物をいくつか持てるようにしてみようと思う。

・小物アセットの追加
追加する小物用に下記の無料アセットを取り込み、机上に置いてみる。
[Laptop’s Package][Low Poly Office Props]

[Asset Store]から検索すると出てくるので[Download]を押してから[Import]をするとプロジェクトのAssetsフォルダにファイルが展開される。
展開された中から好きなオブジェクトのfbxやprefabをsceneやhierarchyタブに放り込んで設置しよう。

・コンポーネントの追加
持てるようにしたいオブジェクトを選択し、Inspectorタブから[Add Component]で下記の項目を追加して設定していく。

◎Mesh Renderer(無ければ追加)
◎Rigidbody(物理特性を付与させる)
 Collision Detection:[Continuous Speculative]
◎Box Collider(当たり判定をつける)
 Center、Sizeを適宜調整し物体の当たり判定を設定する。
 Box以外にもCapsuleやSphere Collider等の別の形状のものがあるのでオブジェクトの形に合わせて適宜選択してもいい。
 Mesh Colliderは物体の形に合わせてColliderがつくが重くなる要因らしいので単純な形のモノであれば他のColliderで設定したほうがいいだろう。
◎Distance Grabbable(Distance Grabberで握れるようにする)
 Allow Offhand Grab:チェック

参考:https://developer.oculus.com/documentation/unity/unity-sf-distancegrab/?locale=ja_JP#grabbable-game-objects

これでモノが持てるようになったはずだ。
これを持てるようにしたいモノにすべて設定していく。
ちなみに各コンポーネント右上の歯車マークから[Copy Component]して貼り付けたい先のオブジェクトで[Paste Component As New]するとコピペができる。
但しCollider類は各オブジェクトによって形が違うので各々で調整したほうがよい。


5.実行

さて、設定ができたので[Build and Run]してみる。
ちなみに動作確認の度に時間をかけてビルドするのが面倒な場合はOculus Linkでヘッドセットを接続すれば画面上部の再生ボタンを押すだけで即動作確認ができる。
これはすごく便利。

無事にPCやファイル、椅子等を手に持ち、振り回したり投げたりすることができるようになった。
オフィスが荒らし放題である。

ちなみに家具を動かせるようにすればオフィスレイアウト変更のシュミレータになるのではと思い、机を持てるようにしてみたのがこちら。

シーンが始まった瞬間に机上に乗っているオブジェクトと物理干渉が起こりLaptopがひっくり返った。
そして当然だが机を持ち上げると上に乗っていた物体は吹っ飛び、モノを並べる時も相互に干渉して簡単に動いてしまうので綺麗に並べるのはなかなか難しい。
机を並べるだけで大惨事である。
シュミレータとするならRigidbodyとColliderを外して物理干渉が起きないようにしたほうがよいだろうかと思ったが、どうやらこれを抜いてしまうとDistance Grabでは握れなくなってしまうらしい。
このあたりはまた今度挑戦してみるとしよう。


ここまでOculus開発ツールのPrefabを活用して一度もコードを書かずに実現できてしまった。
Unityの知識もなくC#も書いたことがない私でもだましだましなんとかここまで辿り着いたが、これ以上のことを実現するためにはそろそろUnityについて基礎的なところだけでも勉強したほうがいいかもしれない。

Part1


3D 3Dモデル Application Aurora Award blender CD cosmetics Design Development DVD flyer IT Newnormal Oculus Package Photoshop Product Quest2 sleeve t-shirt Unity VR/AR Web Webデザイン お菓子 アイデア アニメーション エンジニア モデリング 招待状 照明