はじめに
お高いPerception Neuronとか買わなくても今流行のVirtual Youtuberになれる!!(かも)(Final IKは買おう)
ところで、こんなのを作っています
Trackerしか使わない子供向けおもちゃの #Inst_Paper です。HMDいらないなーと思ってて、
つい最近
SteamVRでViveTrackerだけを使うのあるのかなと思ったら普通にあったわ。
これきっかけで調べたらまずこれを発見しました。
ここは Python使って取得するやつで、
その通りやったらできました。サンプルにUDPで送る方法もあったのでそれでやろうかなーと思っていたら、
今スマホからGitHubのTriad_openvrのPythonソースを読んでるけど中身でやってることは本当にOpenVRの生APIを叩いてるだけなので、vrsettingsを合わせてSteamVR for UnityのC#用OpenVR.csを入れとけばUnityでもそのまま取れそう
と言われたので調べてみよ と思っていたら、
ちょうど私も、HMDなしでTrackerだけ使いたいと思ってたところでした
Unityでの実現方法、こちら(コメント欄)に見つけました。まだ試せてないですhttps://steamcommunity.com/app/358720/discussions/0/133258593389126485/ …
ちょうど私も、HMDなしでTrackerだけ使いたいと思ってたところでした
Unityでの実現方法、こちら(コメント欄)に見つけました。まだ試せてないですhttps://steamcommunity.com/app/358720/discussions/0/133258593389126485/ …
おっ、やっぱりUnityVRサポートオフでVRApplication_Otherで初期化が現状の正解っぽいですねhttps://steamcommunity.com/app/358720/discussions/0/1290691937716060791/ …
と、次々情報が集まってきたのでやったら上手く行った という話です。
やること
VRSettingsを変える
ここらへんに設定ファイルの default.vrsettings があります。
<steamインストールフォルダ>\steamapps\common\SteamVR\resources\settings
これを開いて、 requiredHmd を falseにします。
--- 追記 2019/11/28 ---
default.vr.settingsについて
今日覚えて帰って欲しいこと
default.vrsettingsは編集してはいけないファイル。このファイルを編集すると言う情報は全て間違い。このファイルはデフォルト設定を書いたファイルでアップデートのたびに消される。編集するのは別のユーザー設定ファイル。そもそもこの設定はダッシュボードに昔からある https://twitter.com/ngtkd/status/1192099954371616768 …
default.vrsettingsを編集する→まちがい
steamvr.vrsettingsを編集する→せいかい
steamvr.vrsettingsに書いた内容がdefault.vrsettingsの内容に上書きされて適用されます
とのことです
合わせて上記の設定のままだとHMDを1度PCに繋がなければいけないので、こちらも合わせてご確認ください。
--- 追記おわり 2019/11/28 ---
Steam VRを起動してたら再起動しておきましょう。 利用不可になりますが、通常HMDを繋がないとベースステーションやTrackerが見えるようになります。
Unity側の設定
とりあえずSteam VR Pluginを入れて、Virtual Reality Supportを切ります()
一応 Edit → Preferences からAutomatically Enable VR も切っておきます
これで準備完了 のはず
スクリプトを書く
のは、めんどくさいので用意しました。
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(); | |
} | |
} | |
} |
これを適当にアタッチして使ってください。
こんな感じで使います。
すると
といった具合に使えます。ただ、途中でTrackerを追加したりした時に勝手には対応してくれない(監視するのが面倒い)ので、 Resetボタンを用意しました。デフォだとTabキーを押すといけます。(意味的にRefreshのがよかったかも
トラブルシューティング
Steam VR はβじゃないと動かない…かも?
これやってみたけど、SteamVR起動時に謎のVRInitError_IPC_CompositorConnectFailedエラーが出てベースステーションやトラッカーが認識されない。。たすけて… 【Unity】ViveのHMDなしにTrackerを使う - てんちょーの技術日誌 http://shop-0761.hatenablog.com/entry/2018/01/08/034418 …
SteamVRをbeta版にしたらうまくいった!HMDなしでもポジトラできる!
Init_HmdNotFoundPresenceFailedエラー
@shop_0761 ViveTracker単体動作を試していて、てんちょーさんのブログを見ながらやってるんですが、どうしてもスクリプトのOpenVR.InitのところでInit_HmdNotFoundPresenceFailedエラーが出ちゃうんですよね。SteamVR上の表示は同じなんですが…。良ければ開発環境を教えてもらえませんか?
本当に申し訳ない話をするんだけど、単体動作できました。
HMDを差し直したらSteamVRのコンポーネントが新しくインストールされてその後できるようになったので原因それっぽい…。
ビルドした時に動かない
development buildでビルドして、デバッグしてみるとか?
あ、たぶん openvr_api.dll がないのでは
Projectにdllいれてビルドすればいいかもhttps://github.com/ValveSoftware/openvr/tree/master/bin/win64 …
openvr_api.dll がない可能性があります。win64の場合はこのdllをUnityのAssets/Plugins 以下などに適当に放り込んであげれば 動くはず。
64bit
32bit
ポゴピン
TrackerのRoleを設定しないと入力が取れないようです
けのじ (@kenoooooji) | Twitter さんが検証してくれました ありがとうございます!
まとめ
自分で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