🐯

OpenXRを使ったUnity XRプロジェクトでViveトラッカーを使う

2022/12/18に公開

はじめに

この動画で紹介された手順を、自分で実際に一通り従って設定していて、結果を確かめました。せっかくなので、自分が設定しながら撮っていたスクショを添付し、この日本語の記事にさせていただきました。

ちなみにこちらのこりんさんも同じ内容を大ざっぱに共有されています。

なぜSteamVR PluginではなくOpenXR Pluginを使うか

OpenXRはSteamVRを含むさまざまなプラットフォームに対応しており、これからVRを含むXRの開発の標準規格になるという見込みです。

ViveトラッカーをUnityプロジェクトで使用するには、今はまだSteamVRを介する必要がありますが、Unity上で使うPluginについては、SteamVR Pluginを諦めて先にOpenXR Pluginに移行した方が、今後プロジェクトの拡張や他のプラットフォームへの対応が楽になるのではないかと思います。

* もう一つの原因は普通に、自分がSteamVRのInput Binding(下の画像)が少し使いづらく、しかもなぜか結構効かなくなって再設定しないといけないことが多かったからです...今回紹介させていただく方法の方が便利だと思いますし、設定が効かなくなったりすることもありません。

事前準備

  • OpenXR PluginXR Interaction Toolkitがすでに入っているUnityプロジェクト
    • OpenXR PluginとXR Interaction Toolkitの導入についてはこりんさんの記事を参考していただければと思います。
  • SteamVR対応のVRデバイスがPCに繋がっている
    • 今回はMeta Quest 2を使用するため、Oculus LinkでPCに繋げています。
  • SteamVRが起動され、OpenXRのランタイムとして設定されている
  • Viveトラッカーがペアリングされている

ViveトラッカーのInteraction Profileを追加

こちらの書き込みに貼ってある HTCViveTrackerProfile.cs をダウンロードし、Unityプロジェクトに入れましょう。「はじめに」で言及した動画の概要欄にもリンクが貼ってあります。

HTCViveTrackerProfileが貼ってある書き込み

そしたら、 Edit > Project Settings > XR Plug-in Management > OpenXR > Interaction Profiles の「+」を押したら HTC Vive Tracker Profile が選択肢一覧に表示されると思います。それを選択してInteraction Profilesに加えましょう。

HTC Vive Tracker ProfileをOpenXRのInteraction Profilesに追加する

(2023/11/10更新) Unityのバージョンにより、もし PoseControl という変数関連のエラーが出たら、このスクリプトの15行目を置き換えてください。エラーがなければ置き換えなくても大丈夫です:

// 変更前
using PoseControl = UnityEngine.XR.OpenXR.Input.PoseControl;
// 変更後
using PoseControl = UnityEngine.InputSystem.XR.PoseControl;

トラッカーの役割設定

SteamVRの設定画面を開いて、コントローラ > Viveトラッカーの管理で、今ペアリングされているトラッカーに役割をつけましょう(例えば「腰」として設定します)。

トラッカーに役割をつける

トラッカーの情報が読まれているか確認

Playボタンを押しましょう。そして下のスクショのようにメニューを辿ってInput Debuggerを開きましょう。

Input Debuggerを開く

下のスクショのように、全役割のトラッカーが表示されますが、腰のトラッカーのところをダブルクリックすると、位置と回転が読まれているのを確認できます。

Input Debugger画面

もし読まれていないようであれば、Unityを再起動してみてください。

Input Actionsでトラッカーの情報を使えるようにする

Input Actions Assetを新規作成

Input Actions Assetを作成

トラッカーの役割ごとInput Actions Assetを1つずつ作成してもいいし、全役割を1つのInput Actions Assetにまとめてもいいと思います。

今回は腰のトラッカー1つしかないため、普通にInput Actions Assetを1つ作成します。

Actionsを作成

そしたらAction Mapを作成し、Actionを2つ作りましょう:PositionRotation

トラッカーのPositionとRotationに対応するActionsを作成

Position

Positionを選択し、パネルの右側で以下のように設定しましょう:

Action Type: Value
Control Type: Vector3

下の<No Binding>のところをクリックし、パネルの右側のBinding > Pathをクリックし、XR Tracker > HTC Vive Tracker (OpenXR) > HTC Vive Tracker (OpenXR) (役割) > devicePositionを選択しましょう。




Rotation

Rotationを選択し、パネルの右側で以下のように設定しましょう:

Action Type: Value
Control Type: Quaternion

下の<No Binding>のところをクリックし、パネルの右側のBinding > Pathをクリックし、XR Tracker > HTC Vive Tracker (OpenXR) > HTC Vive Tracker (OpenXR) (役割) > deviceRotationを選択しましょう。

最後にセーブし忘れずに!

Input Action ManagerにActions Asset追加する

XR Interaction Toolkitを使って既に開発が進んだプロジェクトだと、シーンの中にInput Action Managerが既に作られたと思いますが、作ったばかりのプロジェクトであれば、空のGameObjectを作成し、コンポーネントInput Action Managerを付与し、Action Assetsに先程作成したトラッカー用のActions Assetを追加しましょう

これでトラッカーの位置・回転を、UnityのInput Actionで扱えるようになりました!

スクリプトを書いて自由に利用してもいいし、以下のようにTracked Pose Driverを使い、単純にシーンの中のGameObjectの位置・回転をトラッカーと同期させることもできます。

GameObjectとトラッカーの同期

何かのGameObjectを作って(例えばCube)、コンポーネントTracked Pose Driverを付与しましょう。

Position InputRotation InputのそれぞれのUse Referenceチェックを入れて、Referenceをそれぞれ先程作ったPositionとRotationのActionに設定しましょう。

動かしてみよう

Playボタンを押して、トラッカーを手に持って色々動かし、Cubeが同様に動くか確かめましょう!

おわりに

今回はOpenXRを使ったUnity XRプロジェクトでViveトラッカーの情報を扱う方法について紹介させていただきました。

今はViveトラッカーを使うにはまだSteamVRを介する必要がありますが、今後SteamVRを介さなくて済むようになるのかなと勝手に期待したりています。

現状だと、OpenXRを使って何かクロスプラットフォームのXRプロジェクトを開発するとき、「SteamVRを使用する場合だけのオプション機能」としてViveトラッカーを使って、他のプラットフォームだとViveトラッカーを使わずに済む、というようなコンテンツは作れるのではないかと思います。

次の記事はいつになるか分かりませんが、UltimateXRについての記事になると思います。それではまた!

GitHubで編集を提案

Discussion