見出し画像

LeapMotion(Leapifyドライバ使用)とVMT(Virtual Motion Tracker)の併用について


1. この記事の対象は

  • SteamVR で遊ぶためのHMDがあるけどそれにはコントローラーがないか使いたくない状態で

  • 代わりにLeapMotionでハンドトラッキングしつつボタン入力もできるコントローラーも使いたいけれど

  • driver_leapやdriver_leapify+driver_joyleapで使えるJoy-Con入力とは違う設定を試したい

  • あわよくばOSCとかで操作の内容を送信するのをいろいろ自作したい

  • あるいはVMTを使っている実例を見たい

という人むけです

2. なぜそんなことを

コントローラーのないHMDというのは、たとえばOpenTrackを使ってPC画面を見ながらSteamVRする場合や、VIVE FlowのようなコントローラーがないけどSteamVRに繋ぐ手段があるものを使っている場合です。

そのようなときにLeapMotionで手の位置を取得してコントローラーの代替をしたい場合に、LeapMotion 初代でも使えるオープンソースの OpenVRドライバである Leapifyが利用可能です。
この Leapify には、LeapMotionから得た手の位置や指のSkeletal情報を、他のコントローラーに渡すパススルー機能があります。
Leapify 自体はボタン入力等の機能がないのですが、コントローラーとしての役割を止めて(電源オフの色になり)「他の位置が取れないコントローラー」に座標を委ねることで、合わせ技一本のコントローラにできるという仕組みです。

パススルーをオンにすると、Leapifyのコントローラーはグレーになり、
VMTコントローラー(六角形)のほうに座標が渡されます。
右のVMTManagerはボタン操作のテスト等に使えます。
VMTをオフにして、パススルーをオフにすると、
Leapify自身がコントローラーの役割になりますが、
LeapMotionだけではボタン入力等ができません。

「他の位置が取れないコントローラー」として、Leapifyと同じ方が開発されている joyleap を使うのが想定されているかと思いますが、Joy-ConをPCに接続するのは頻繁に(ほぼ毎回)切断からやりなおしになるのがだるいので、joyleap の代わりに VMT(Virtual Motion Tracker) による仮想コントローラーに座標を渡して、OSCでボタン入力等を送ってやればいいのでは?と試したらできましたのでやり方メモです。

(余談:記事書いてる時にリンク確認してたら、Leapify2 というのが開発中みたいですね)

2. 準備

  1. LeapMotion に必要な UltraLeapのソフトウェア(初代ならGeminiの v5系)を入れて、動作確認しておきます。

  2.  driver_leapify の 1.3.0beta (またはお好みのバージョン)を配布元からダウンロードして、SteamVRドライバのパスに入れます。通常は
    C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\
    の中に leapify というフォルダができる構成になります。

  3. もし、driver_joyleap を入れてしまっている場合は競合するので、上記ドライバディレクトリの中に入れたものを、削除しておきます。

  4. VMTの 0.15(またはお好みのバージョン)のセットアッププログラムを配布元からダウンロードして、公式説明に従ってインストール・設定します。

  5. SteamVRを起動して、アドオンの設定画面でvmt, leapifyが有効になっていることを確認します。また、他の仮想コントローラーを出現させるもの(VirtualDesktopやOpenGloves)は念のためオフにしておきます。VIVE FlowをHMD化するときに使う CloudXRRemoteHMDはオンでもVMTが優先されるので大丈夫です。

3. コントローラーを認識させる手順

SteamVRを起動すると、直後ではLeapifyが非パススルーモードになっているので、いったんパススルーモードに設定を変更します。

初期状態。1つめが大元のオンオフで、加えて上から2つめと3つめをEnabledにします。
他は調整項目なので割愛。

さらに、スタートメニューに登録されている Virtual Motion Tracker を起動すると、VMT Manager 画面が出てくるので(Roomセットアップなどで既に使っているかと思いますが) Inputタブで、次の画像の赤文字の順番でボタンを押します。1,2を押すとSteamVRが左仮想コントローラーを認識し、3,4を押すとSteamVRが右仮想コントローラーを認識します。CompatibleというのはIndexコントローラー互換になります (LeapMotionの指曲げがIndex互換としてVRChatなどで反映されます)
以後、左コントローラーのテストをしたい場合は赤の1を、右コントローラーのテストをしたい場合は赤の3を押して(Operation Targetを設定して)から下のパネルを使います。Button 0をおせばダッシュボードが出たり消えたりするはずです(しない場合は先を読んでください)
なお、赤1/3で対象を選んでから [0] Disable を押すとコントローラーの電源をオフにした状態になります。

VMT_1を左手のIndex互換仮想コントローラーと登録し、
VMT_2を右手のIndex互換仮想コントローラーとして登録

あとはLeapMotionで認識した手の動きがVMTのコントローラー位置に反映されるし、VMTのボタン操作も使える…と思いますよね?なぜか一部有効にならなかったりします。(ボタンが効かなかったり、トラッキングが伝わらなかったり)
このときは、Leapify の設定画面の上から3つの項目「Hand tracking」「Skeletal data passthrough」「Position data passthrough」をDisabledにしてからEnabledにし直すと動きます。
100%こうすればOKという手順を見つけられてないのですが、適当にオンオフしてれば動くようになります。(本当はLeapifyが後から登場しなければいけないのに、手順的にVMTが後から出てくることで初期化がうまくいかない部分があるように見えます)

4. 別に使いやすくなってないんですが???

VMTに向けてOSCを送るなにかを用意しないと、VMTManagerではテスト程度のことしかできません。

わたしはJoy-ConをESP32に繋いでESP32からVMTにOSC送るやつを過去に自作?(他の方が作られたps3やWii用のを改変)してあったので、それを使っています。毎回ペアリングしなくていいだけでもだいぶん便利だと思っています。

VMTのドキュメント見ながらOSCでいろいろ送ればOKです。位置を送るのが一番難しいのですが、それはLeapifyに任せられるのでVMTを使うのがかなり楽になると思いますが、、、開発者向け、ですかね。

以上でした!

いいなと思ったら応援しよう!