ミライのおもちゃ箱

プログラミング・VR・ドローンとか

【VR】Unityで手を使ってものをつかむ+遠距離から引き寄せる方法(Oculus Rift S + Touch, Unity 2019.4.1f, Oculus Integration, Distance Graberの場合)

f:id:sayadoki:20200628155122p:plain

 

最近、UnityでVRの開発をはじめました。

 

「手(Oculus Touch)を使って、じぶんの好きなオブジェクトに触れたい…」

たったそれだけのことでしたが、そこそこ詰まったので、せっかくなので備忘録を残しておきます。

 

 

開発環境

  • Oculus Rift S
  • Oculus Touch
  • Unity 2019.4.1f
  • Oculus Integration 17.0
  • Distance Graber

 

基本的な手順

Unityのインストール

まずはUnity 2019.4.1fをインストールします。他のバージョンでも動作するかもしれませんが、私はこちらを使っています。ちなみにUnityのバージョン管理のためにUnity Hubを使っています。

 

次に先ほどのバージョンで、Unityで新しいプロジェクトをつくります。

 

UnityにXRの設定

プロジェクト設定→Player→XR設定から、『VRサポートあり』にチェックをいれます。

 

Oculus Integrationの利用

アセットストアから、Oculus Integrationをダウンロードして、インポートします。Oculusの機能を使うために必要なアセットが詰まっています。

 

Oculus Integrationをインポートする際には、Unable to start Oculus XR Plugin.というエラーを避けるため、以下の記事の手順に従いました(私自身ははじめからこの手順を踏んだため、エラーに遭遇していません)。詳細は記事を確認してください。

 

qiita.com

 

サンプルシーンの確認

プロジェクトのAssets\Oculus\UsageにあるDistanceGrabのシーンで、特に手のインタラクションについて、どのようなことができるか確認できます。それぞれのオブジェクトやスクリプトの意味などの詳細は以下の公式サイトで紹介されています。

 

developer.oculus.com

 

じぶんのプロジェクトへの導入

ポイントの確認

実際にじぶんのプロジェクトに手を召喚しましょう。

 

重要なのは、

  • 視点:OVRPlayerController
  • 左手:DistanceHandGrabLeft
  • 右手:DistanceHandGrabRight

です。

 

この3点をDistanceGrabのシーンから、じぶんのシーン(なければ新規作成)にコピペしておきます。

 

左手と右手の初期設定

このとき、DistanceHandGrabLeftとDistanceHandGrabRightのParent TransformとPlayerが空の状態になっています。

 

Parent TransformにはOVRPlayerController/OVRCameraRig/TrackingSpaceのそれぞれLeftHandAnchorとRightHandAnchorを設定しておいてください。

 

また、PlayerにはともにOVRPlayerControllerを設定しておいてください。

 

この設定を忘れていると、以下の動画のように手が地面で這いずり回ることになります。

 

 

もたれる側のオブジェクトの設定

どのようなオブジェクトでもいいので、もちたいオブジェクトを用意します。試しにキューブをつくりましょう。

 

もたれる側には以下の設定が必要と公式ドキュメントに記載されています。

  • 任意のCollider
  • Rigidbody
  • DistanceGrabbable

 

キューブにははじめからBox Colliderがセットされているため、物理のRigidBodyとスクリプトのDistanceGrabbableをセットします。

 

もたれる側のオブジェクトのレイヤーに注意

ここで注意しないといけないことは、DistanceGrabHandLeftやDistanceGrabHandRightにとりつけているDistance Grabber (Script) で、つかむ対象のレイヤーを決めていることです。

 

私は『Grabbable』というレイヤーを追加して、そのレイヤー番号をGrab Objects in Layerにセットしました。

 

 

以上の設定で、以下の動画の通り、任意のオブジェクトをつかむことができます。私はかねてから待望の質点をつかむことができました…。

 

 

空間の色の設定

先ほどの動画でお気づきの通り、空間が真っ暗な状態になっています。

 

これはOVRPlayerController/OVRCameraRig/CenterEyeAnchorでクリアフラグがソリッドカラーと背景が黒色になっているためです。

 

クリアフラグをスカイボックスに設定すると見慣れた背景を取り戻すことができます。

 

やっぱり質点は空の下で揺らしたいですよね。。。

 

 

以上。ごくごく簡単に、Oculus Rift Sで手を使ってつかむ方法をまとめました。Questの場合はAndroidの設定などが必要なため、以下の記事を参考にしてください。

 

私は今回の作業をするにあたり、以下の記事を大枠で参考にさせていただきました(感謝です)。Questではなく、Rift Sである点、AvaterGrabではなく、DistanceGrabにした点が大きな違いになります。

 

raspberly.hateblo.jp