Der Oculus und der Vive verfügen über diesen Lichtnäherungssensor, der erkennt, ob Sie Ihr VR-Headset gerade auf Ihrem Kopf platziert haben oder nicht.
Gibt es eine Möglichkeit, dies für unsere eigenen Spielprüfungen zu nutzen? ZB können wir das Spiel anhalten oder neu starten, je nachdem, ob das Headset getragen wird oder nicht.
Ich verwende Unity / C #, aber jede Hilfe (auf Treiber- / API-Ebene) wird sehr geschätzt.
unity
virtual-reality
oculus
htc-vive
Spektralsprung
quelle
quelle
Antworten:
Ja, OpenVR hat Ereignisse dafür:
Darüber hinaus können Sie den Status des Headsets mit pollen
GetTrackedDeviceActivityLevel
von Valve.VR.IVRSystem . Welches einen der folgenden Werte zurückgibt:In den Unity-Skripten (Scripts / Core / VRView.cs: GetIsUserPresent () ist auch eine gewisse Ebene davon eingeführt.
quelle
Einschalten, um ein Ereignis mit montiertem / Näherungssensor für das Oculus OVR Unity Plugin zu überprüfen. Dies ist in
OVRManager
:Was in der Quelle vorhanden ist, aber aus irgendeinem Grund nicht durch Durchsuchen der Oculus-Dokumente angezeigt wird .
[BEARBEITEN]
Wenn Sie nicht möchten, dass Oculus das Spiel auf einem schwarzen Bildschirm anhält, wenn Sie das Headset abnehmen:
Wenn Sie mit Version 1.3 (2016) oder darunter, des Oculus SDK, dann setzt
runInBackground = true
inOVRManager
, die von der Einheit der eigenen unabhängigerunInBackground
Einstellung.In neueren Versionen verwenden Sie Unity's
Application.runInBackground = true
undCamera.stereoTargetEye = StereoTargetEyeMask.None
[EDIT2]
Die OVRManager-Ereignisse haben bei mir überhaupt nicht funktioniert. Was funktioniert, ist die
OVRPlugin
Klasse zu benutzen und sichif (!OVRPlugin.userPresent && m_wasUserPresent)
selbst zu tun .quelle
In Unity funktioniert Folgendes mit dem OpenVR Unity-Plugin:
Übrigens, in einer Antwort auf die akzeptierte Antwort, die ich vorgeschlagen habe:,
OpenVR.System.GetTrackedDeviceActivityLevel(0)
aber das ist mehr, um die jüngste Bewegung innerhalb von 10 Sekunden zu erkennen.quelle
Sie können jetzt auch
UnityEngine.XR
undXRDevice.userPresence
ohne zusätzliche APIs verwenden: https://docs.unity3d.com/ScriptReference/XR.XRDevice-userPresence.htmlBeispielsweise :
quelle
In Android gibt es den Näherungssensor . Dies wird verwendet, um den Bildschirm zu deaktivieren, wenn Sie jemanden anrufen. Ich bin nicht sicher, ob Sie in Unity Zugriff auf den Näherungssensor haben, aber Sie können die native Methode über Unity aufrufen.
quelle
Wenn jemand die Oculus VR-Anwendung zwingen möchte, das Spiel nicht anzuhalten, während das Headset ausgeschaltet ist, müssen Sie einige DLL-Aufgaben ausführen. [Quelle]
Hier ist, wie und ich habe auch Code für die SteamVR / OpenVR-Einstellungen eingefügt:
quelle
Der SteamVR-Eingang wurde kürzlich vollständig geändert. Er verwendet jetzt Aktionen. Hier finden Sie eine schrittweise Anleitung vom Ventil zur Einrichtung.
Hier ist eine der (besten) Möglichkeiten, um es im Code abzufragen:
Beachten Sie, dass es ab sofort einen Fehler gibt, der Sie daran hindert, SteamVR zu verwenden, um den Näherungssensor einer Aktion zuzuweisen, wenn Sie ein HTC Vive oder Vive Pro haben, obwohl es ironischerweise wie beabsichtigt funktioniert, wenn Sie es mit einem verwenden Oculus Headset. Auf dieser Seite mit Steamvr-Github-Problemen gibt es eine einfache Lösung .
Beachten Sie auch, dass OpenVR in der Regel das implementiert, was SteamVR bietet. Derzeit können Sie jedoch nicht auf den Näherungssensor zugreifen. Das einzige, was Sie mit OpenVR tun können, ist das zu überprüfen,
EDeviceActivityLevel
wie MichaelHouse in seiner Antwort erklärt hat. Dies ist jedoch nutzlos, da die einzige Ebene, an der der Prox-Sensor beteiligt ist, diek_EDeviceActivityLevel_UserInteraction
Verbindung zwischen Prox und Kreisel ist. Laut OpenVR interagiert das Headset also für immer mit dem Benutzer, solange eine leichte Brise oder Vibration den Neigungssensor kippt Headset alle 10 Sekunden ein wenig.[BEARBEITEN]
Einige Dinge wurden in der Zwischenzeit behoben. Zum Beispiel gibt es jetzt einen Eintrag für den Hmd anstelle von Any; und OpenVR hat einen XRDevice.userPresence-Wert (obwohl dies möglicherweise nicht explizit der Näherungssensor ist).
quelle
Für OVR
ovr_GetSessionStatus()
sagt Ihnen dies,OVRSessionStatus
hat ein FeldHmdMounted
.quelle