てんちょーの技術日誌

自分がつまづいたこととかメモ

【Unity】ViveのHMDなしにTrackerを使う

はじめに

お高いPerception Neuronとか買わなくても今流行のVirtual Youtuberになれる!!(かも)(Final IKは買おう)

ところで、こんなのを作っています

Trackerしか使わない子供向けおもちゃの #Inst_Paper です。HMDいらないなーと思ってて、

つい最近

これきっかけで調べたらまずこれを発見しました。

www.roadtovr.com

ここは Python使って取得するやつで、

その通りやったらできました。サンプルにUDPで送る方法もあったのでそれでやろうかなーと思っていたら、

と言われたので調べてみよ と思っていたら、

と、次々情報が集まってきたのでやったら上手く行った という話です。

やること

VRSettingsを変える

ここらへんに設定ファイルの default.vrsettings があります。

<steamインストールフォルダ>\steamapps\common\SteamVR\resources\settings

これを開いて、 requiredHmd を falseにします。

--- 追記 2019/11/28 ---
default.vr.settingsについて

とのことです


合わせて上記の設定のままだとHMDを1度PCに繋がなければいけないので、こちらも合わせてご確認ください。

shop-0761.hatenablog.com

--- 追記おわり 2019/11/28 ---

f:id:shop_0761:20180108032049p:plain

Steam VRを起動してたら再起動しておきましょう。 利用不可になりますが、通常HMDを繋がないとベースステーションやTrackerが見えるようになります。

Unity側の設定

とりあえずSteam VR Pluginを入れて、Virtual Reality Supportを切ります()

f:id:shop_0761:20180108032253p:plain

一応 Edit → Preferences からAutomatically Enable VR も切っておきます

f:id:shop_0761:20180108032439p:plain

これで準備完了 のはず

スクリプトを書く

のは、めんどくさいので用意しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
public class SelfManagementOfTrackedDevices : MonoBehaviour
{
public GameObject[] targetObjs;
public ETrackedDeviceClass targetClass = ETrackedDeviceClass.GenericTracker;
public KeyCode resetDeviceIds = KeyCode.Tab;
CVRSystem _vrSystem;
List<int> _validDeviceIds = new List<int>();
void Start()
{
var error = EVRInitError.None;
_vrSystem = OpenVR.Init(ref error, EVRApplicationType.VRApplication_Other);
if (error != EVRInitError.None) { Debug.LogWarning("Init error: " + error); }
else
{
Debug.Log("init done");
foreach (var item in targetObjs) { item.SetActive(false); }
SetDeviceIds();
}
}
void SetDeviceIds()
{
_validDeviceIds.Clear();
for (uint i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
{
var deviceClass = _vrSystem.GetTrackedDeviceClass(i);
if (deviceClass != ETrackedDeviceClass.Invalid && deviceClass == targetClass)
{
Debug.Log("OpenVR device at " + i + ": " + deviceClass);
_validDeviceIds.Add((int)i);
targetObjs[_validDeviceIds.Count - 1].SetActive(true);
}
}
}
void UpdateTrackedObj()
{
TrackedDevicePose_t[] allPoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
_vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, allPoses);
for (int i = 0; i < _validDeviceIds.Count; i++)
{
if (i < targetObjs.Length)
{
var pose = allPoses[_validDeviceIds[i]];
var absTracking = pose.mDeviceToAbsoluteTracking;
var mat = new SteamVR_Utils.RigidTransform(absTracking);
targetObjs[i].transform.SetPositionAndRotation(mat.pos, mat.rot);
}
}
}
void Update()
{
UpdateTrackedObj();
if(Input.GetKeyDown(resetDeviceIds)){
SetDeviceIds();
}
}
}
gist.github.com

これを適当にアタッチして使ってください。

こんな感じで使います。

f:id:shop_0761:20180108033556p:plain

すると

といった具合に使えます。ただ、途中でTrackerを追加したりした時に勝手には対応してくれない(監視するのが面倒い)ので、 Resetボタンを用意しました。デフォだとTabキーを押すといけます。(意味的にRefreshのがよかったかも

トラブルシューティング

Steam VR はβじゃないと動かない…かも?

Init_HmdNotFoundPresenceFailedエラー

ビルドした時に動かない

openvr_api.dll がない可能性があります。win64の場合はこのdllをUnityのAssets/Plugins 以下などに適当に放り込んであげれば 動くはず。

64bit

github.com

32bit

github.com

ポゴピン

TrackerのRoleを設定しないと入力が取れないようです

けのじ (@kenoooooji) | Twitter さんが検証してくれました ありがとうございます!

kenoji.hatenablog.jp

まとめ

自分でOpenVRを初期化すればいろいろできそう

このHMDなしバージョンで #Inst_Paper を銀VR 2日目に展示する予定ですのでよければー

http://jvr-fest.com/2017/11/2958/

全く関係ないですが、Udemyの講座 よかったら買って欲しい(割引きクーポンつきURL貼っとくので

https://www.udemy.com/unrealengine-4-archviz-vr/?couponCode=TENCHO_435970www.udemy.com