はむすたーの巣

ちょっとかじって見たこととか興味持ったこととか記事というよりメモな感じにまとめます。たまに消します。きっと。

HTCViveのTrackerをHMDなしで動かしつつ、ポゴピンのボタン入力イベントを受け取ろうとしたらハマった話

はじめに

HTCViveのTracker、便利ですよね。

なにが便利なの

  • 圧倒的な安価で光学式トラッキングが行える
  • お手軽に使える
  • ポゴピン使えば少し入力もできる

という感じで非常に優秀です。
そこで、これVRコンテンツに限らず普通にトラッキングバイスとして使いたいなぁ....という願望が出てきました。 研究で使いたいなぁ、ということで使ってみることに。

TrackerをHMD抜きで動かす方法

先人の方々の知見を参考にしながら、触って行きます。

shop-0761.hatenablog.com 構築した環境では過去にHMDを接続したことがなかったため、以下のサイト様の記事を参考に追加の作業が必要でした。

syan0.hatenadiary.org

以上の記事を参考にしながら、Unity上でTrackerの座標を取得することができました。

おまけ(MacUbuntuでも挑戦してる人いるみたいです、僕は試せていません)

qiita.com

bluelet.sakura.ne.jp

ポゴピンを使って入力を行ってみる

何故か反応しなかったです、 で、その原因(あっけない)が以下でした。

ハマりどころ

そもそもTrackerのポゴピンは、SteamVRのトラッカーの管理からハンドヘルドを選択していないと反応しないよって話でした。
すごい時間を使ったのにあっけない....
TargetClassがGenericTrackerになったりControllerになったりすることがあるみたいですが、どちらでも反応はする模様です。
一度GenericTrackerでなくControllerとして認識されたときに、たまたまその時に反応するようになったことから、Controllerであることがイベント反応の要因か?と考えたりもしたのですが、GenericTrackerと認識されている状態でもトラッカーの管理からハンドヘルドを選択することでポゴピンが反応するようになりましたとさ...

動作が確認できた環境

こちらの記事に掲載されているソースコードを用いてトラッキングを行っている状態で同ソースコードに追記する形で動作を確認しました。

shop-0761.hatenablog.com

openvr_api.cs

このあたりを参考に

valvesoftware.github.io

vr-lab.voyagegroup.com

var system = OpenVR.System;
system.GetControllerState((uint) _validDeviceIds[0], ref state,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t)));
Debug.Log(state.ulButtonPressed);

として、ピンの操作でulongの値が変動することを確認しました。

SteamVRPlugin v1.2.3

こちらの記事の中程に掲載されている入力を取得するコードを組み合わせて動作を確認しました。

framesynthesis.jp

deviceは var device = SteamVR_Controller.Input(_validDeviceIds.First()); とすることで取得できました(今回はTracker一つだけ接続しています)。

SteamVRPlugin v2.5.0

いまテストしてます(設定が上手にできない)
- できそうかハッキリしたら追記

まとめ

steamVRのトラッカーの管理画面の設定をちゃんとやらないとポゴピン使ったイベントは握りつぶされるよ。
OpenVR_Api経由で直に叩いてもだよ。
変則的な環境で混乱したけどこれ別に普通のViveな環境でも起きることなんだろうな...(大昔触ったときは特にこの手のハマりは発生しなかったので、アップデートで増えた機能なのかな....)

お礼

てんちょー様( てんちょー / 筑野(ちくの)えり💕🍱 (@shop_0761) | Twitter )、本記事で挙げました問題について、初歩的で急な質問にもかかわらず、親身になって相談に乗っていただき、大変ありがとうございました。