想定する環境
- Windows 10 64bit
- Unity 2018.2.17f1
VRPNとは
VRPN(Virtual Reality Peripheral Network)とは、VRデバイスをTracker、Axis、Buttonなどの型に抽象化して一元的に制御できるようにしたインターフェースです。OculusやViveが存在しない時代に生まれた古のVR規格です。
接続デバイスを定義してVRPNサーバーを立て、アプリケーションをサーバーに接続すると、デバイスの情報を取得することができます。
VRPNサーバーをビルドする
現在はWindows用のバイナリが配布されていないため、自分でビルドする必要があります。(過去に配布されていたらしきページにはアクセスできなくなっています)
- 以下のソフトウェアをDL・インストール
- 以下のファイルをDL
- CMakeにSourceディレクトリとBuildディレクトリを指定
- Configureをクリック
- インストールしたVisualStudioのバージョンを指定してFinishをクリック
- BUILD_TESTINGチェックを外し、CMAKE_INSTALL_PREFIXにビルド先ディレクトリのパスを入力してConfigureをクリックし、Generateをクリック
- BuildディレクトリのVRPN.slnを実行し、VisualStudioが起動したらALL BUIIDを実行(F5)
- このときエラーが出るがスルーしてよい
- ソリューションエクスプローラーのINSTALLの上で右クリックしてビルドをクリック
VRPNクライアントとサーバーを疎通する
VRPNサーバーを経由してマウス入力を取得します
- Build/binディレクトリを開く
- vrpn.cfgを開き、空いている行に
vrpn_Mouse Mouse0
と入力して保存 - vrpn_server.exeを実行してサーバーを立ち上げる
- cmdで
vrpn_print_devices.exe Mouse0@localhost
を実行し、サーバーに接続 - 接続に成功すると、vrpn_print_devices.exeに現在のマウス入力のAnalog値とButton値が表示されます
UnityからVRPNサーバーに接続する
UnityにはネイティブでVRPNに接続するためのClusterInputクラスがありますが、試した限りでは使えませんでした。(フォーラムにも"あるバージョンから使えなくなった"という言及もあります。)
他に使えそうな外部ライブラリが無いか探したところ、
- Laremere/unityVRPN: Simple VRPN wrapper for unity
- vrpn/VrpnNet: .NET bindings for VRPN
- OSVR Developer Portal
が見つかりました。今回は一番上のUnityVRPNを使用します。
- こちらからWindows 64bit用のビルドをDL
- VRPN.cs をDL
- Unityプロジェクトに上記2つを放り込み、以下のスクリプトをCubeかなにかにアタッチすると、マウスに連動してオブジェクトが動きます。
UnityVRPNExample.cs
using UnityEngine;
public class UnityVRPNExample : MonoBehaviour
{
private string _deviceName = "Mouse0";
private string _serverAddress = "localhost";
private string _fullAddress;
private void Start()
{
_fullAddress = _deviceName + "@" +_serverAddress;
}
void Update()
{
var mult = 2f;
var x = (float)VRPN.vrpnAnalog(_fullAddress, 0) * mult;
var y = (float)VRPN.vrpnAnalog(_fullAddress, 1) * mult;
transform.position = new Vector3(x, 0, y);
}
}