Unity上でEDTrackerを使ったヘッドトラッキング

Unity上でEDTrackerを使ったヘッドトラッキングを実験したので、その備忘録。

EDTrackerとはArduino+ジャイロセンサーを使ったヘッドトラッキングデバイスです。完成品のProと自作向けのDIYの2種類があり、DIYは専用基板を買って作ることもユニバーサル基板上で完全に自作することもできます。詳細は公式サイトで確認してください。

EDTracker

今回はリファレンス機としてProを使いましたが、自作したものでも結果は同じだと思います(自作用のパーツは用意したんですが、まだ作ってないので…)

EDTrackerはopentrackを経由することで既存のさまざまなゲームで使えるような運用になっているようです。

今回はopentrackを経由せず直接EDTrackerの情報をUnity上で扱えるようにするのが目的です。

EDTrackerはWindowsからはジョイスティックとして認識され、トラッキング情報はジョイスティックの軸データとして取得できます。joy.cpl(昔はコントロールパネルから実行できたんですけどねぇ)で確認すると、X軸・Y軸に-1~1の範囲でデータが入ってくるので、このデータをヨー・ピッチとして使えば良さそうです。

【注意】EDTrackerUIでYaw ScalingとPitch Scalingを1.0にしておく必要があります

しかしここで問題が。Unity標準のInput.GetAxisRawでは期待した値が取得できませんでした。問題切り分けのためWin32APIのJoyGetPosExでEDTrackerのスティックデータを取得したところ期待していた-1~+1の範囲の値を取得出来ました。
おそらくUnity側の問題だと思うんですが、あまり突っ込んだ調査はせずJoyGetPosExをC#から呼べるようにしてUnityで使えるようにしました。
(Win32APIをC#で呼び出す方法は”C# DLLImport”等でググると出てきます )

ちなみにヨーのデータは正面を 0 として左方向にマイナス、右方向にプラスで、真後ろが-1もしくは+1になります。

なので

float axis = (((float)JoyInfoEx.dwXpos - 32767) / 32768);
Yaw = Mathf.Clamp(axis, -0.5f, 0.5f) * 180f;

とすれば、左を向けば -90f、右を向けば 90f がYawに格納されます。
あとはカメラのTransformを回転させればヘッドトラッキングが実現出来ます。

transform.rotation = Quaternion.Euler(
-Pitch * RotationSpeed,
Yaw * RotationSpeed,
0f * RotationSpeed);

まぁリアルに頭を90度横に向けてしまうと画面が見られないので、opentrackのマッピング機能と同等の機能を実装して調整出来るようにする必要があると思います。

とりあえず今はインスペクタである程度調整できるようにしています。
(上はヘッドセットの入力を左右30度の入力でカメラを左右90度回す設定)

これでとりあえずUnityでEDTrackerが使えるようになりました。
ヘッドトラッキングだけではVRのような没入感は得られませんが、頭の動きにカメラが追従するのでだけでも結構楽しめますし、なにより高価なHMDを使わないので簡単に利用出来るのもメリットだと思います(EDTrackerを完全自作するなら部品代は1500~2000円ぐらいです)

できればNx Head TrackerのようにBluetooth接続できるといいんですけどね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です