Kiểm tra xem tai nghe OpenVR / SteamVR / OculusVR có được gắn trên đầu của bạn không


7

Oculus và Vive có cảm biến tiệm cận ánh sáng này giúp phát hiện xem bạn có đặt tai nghe VR trên đầu hay không.

Có cách nào để khai thác điều đó để kiểm tra trò chơi của chúng ta không? Ví dụ: Chúng tôi có thể tạm dừng hoặc khởi động lại trò chơi tùy thuộc vào việc tai nghe có bị mòn hay không.

Tôi đang sử dụng Unity / C #, nhưng mọi trợ giúp (cấp trình điều khiển / API) đều được đánh giá cao.


Chủ đề duy nhất khác trên internet về vấn đề này là vấn đề này nhưng không có giải pháp thực sự: forum.oculus.com/developer/discussion/23927/ Kẻ
Spectraljump

Câu trả lời:


7

Có, OpenVR có các sự kiện cho việc này:

VREvent_TrackedDeviceUserInteractionStarted kích hoạt khi các thiết bị chuyển từ Chế độ chờ -> UserInteraction hoặc Idle -> UserInteraction. VREvent_TrackedDeviceUserInteractionEnded kích hoạt khi các thiết bị chuyển từ UserInteraction_Timeout -> nhàn rỗi

Ngoài ra, bạn có thể thăm dò trạng thái của tai nghe GetTrackedDeviceActivityLeveltừ Valve.VR.IVRSystem . Cái nào sẽ trả về một trong các giá trị sau:

public enum EDeviceActivityLevel
{
    k_EDeviceActivityLevel_Unknown = -1,
    k_EDeviceActivityLevel_Idle = 0,
    k_EDeviceActivityLevel_UserInteraction = 1,
    k_EDeviceActivityLevel_UserInteraction_Timeout = 2,
    k_EDeviceActivityLevel_Standby = 3,
}

Cũng có một số cấp độ này được đưa vào tập lệnh Unity (ScScript / Core / VRView.cs: GetIsUserPftime ()


Xinh đẹp. Trong khi đó, tôi cũng tìm thấy sự kiện Oculus OVRManager.HMDMounted trong trường hợp bất cứ ai cần điều đó.
Spectraljump

Trong Unity sử dụng plugin OpenVR, chức năng cần kiểm tra là: OpenVR.System.GetTrackedDeviceActivityLevel (0) Tuy nhiên, tôi nhận thấy nó không kiểm tra khi tai nghe ở trên đầu ai đó, nó chỉ cho bạn biết khi tai nghe di chuyển. 10 giây không có chuyển động và nó quay trở lại chế độ chờ.
niltoid

Có thể tùy thuộc vào thiết bị và cách họ triển khai phần mềm của họ để hoạt động với OpenVR.
MichaelHouse

Có nghĩa là, trong trường hợp của tôi, đó là HTC Vive
niltoid

2

Đi sâu vào để kiểm tra một sự kiện cảm biến được gắn / gần cho plugin thống nhất Oculus OVR. Đây là trong OVRManager:

/// <summary>
/// Occurs when an HMD is put on the user's head.
/// </summary>
public static event Action HMDMounted;

/// <summary>
/// Occurs when an HMD is taken off the user's head.
/// </summary>
public static event Action HMDUnmounted;

Điều này hiện diện trong nguồn nhưng vì một số lý do không xuất hiện bằng cách tìm kiếm các tài liệu oculus .

[BIÊN TẬP]

Ngoài ra, nếu bạn không muốn Oculus tạm dừng trò chơi sang màn hình đen khi bạn tắt tai nghe:

  • Nếu bạn đang sử dụng phiên bản 1.3 (2016) hoặc thấp hơn, của Oculus SDK, sau đó đặt runInBackground = truevào OVRManager, đó là độc lập với chính thống nhất của runInBackgroundkhung cảnh.

  • Trong các phiên bản mới hơn, sử dụng Unity's Application.runInBackground = trueCamera.stereoTargetEye = StereoTargetEyeMask.None

[EDIT2]

Các sự kiện OVRManager hoàn toàn không phù hợp với tôi. Những gì làm việc là sử dụng các OVRPluginlớp học và làm if (!OVRPlugin.userPresent && m_wasUserPresent)cho chính mình.


2

Trong Unity, sử dụng plugin unity OpenVR, các công việc sau:

print(SteamVR_Controller.Input(0).GetPress(EVRButtonId.k_EButton_ProximitySensor));

BTW, để đáp lại câu trả lời được chấp nhận mà tôi đã đề xuất: OpenVR.System.GetTrackedDeviceActivityLevel(0)nhưng đó là nhiều hơn để phát hiện chuyển động gần đây trong vòng 10 giây.


Wow, có một "nút" cảm biến tiệm cận được xác định. :) Tìm thấy tốt đẹp.
Spectraljump

1
Cập nhật: Nếu phương pháp OpenVR này (vẫn) không làm việc cho Oculus, có vẻ như có một lỗi trong trình điều khiển openvr cho oculus: steamcommunity.com/app/358720/discussions/0/405691491125141530/...
Spectraljump

2

Bây giờ bạn cũng có thể sử dụng UnityEngine.XRXRDevice.userPresencekhông cần API bổ sung: https://docs.unity3d.com/ScriptReference/XR.XRDevice-userPresence.html

Ví dụ :

if(trackingPresence == true)
    {
        if(XRDevice.userPresence == UserPresenceState.Present && playerPresent == false)
        {
            playerPresent = true;
            Debug.Log("[PLAYER PRESENCE DETECTOR] player is now present");
        }

        if(XRDevice.userPresence == UserPresenceState.NotPresent && playerPresent == true)
        {
            playerPresent = false;
            Debug.Log("[PLAYER PRESENCE DETECTOR] player is now absent");
        }
    }

Đẹp. Cuối cùng. Nhận thấy rằng API cấp độ cao và không rõ ràng về độ gần: "Hành vi chính xác của thuộc tính này sẽ thay đổi theo từng loại thiết bị - một số thiết bị sẽ có cảm biến đặc biệt để phát hiện sự gần gũi của người dùng và người dùng sẽ dựa vào chuyển động"
Spectraljump

1

Trong Android, có cảm biến tiệm cận . Điều này được sử dụng để vô hiệu hóa màn hình khi bạn gọi cho ai đó. Tôi không chắc liệu bạn có quyền truy cập vào cảm biến tiệm cận trong Unity hay không, nhưng bạn có thể gọi phương thức gốc thông qua Unity.


1

Nếu bất cứ ai muốn buộc ứng dụng Oculus VR không tạm dừng trò chơi trong khi tai nghe bị tắt, bạn cần phải thực hiện một số công cụ dll. [nguồn]

Đây là cách và tôi cũng đã bao gồm mã cho cài đặt SteamVR / OpenVR:

    using System.Runtime.InteropServices;
    [DllImport("OVRPlugin", CallingConvention = CallingConvention.Cdecl)]
    public static extern bool ovrp_SetAppIgnoreVrFocus(bool value);
    [DllImport("OVRPlugin", CallingConvention = CallingConvention.Cdecl)]
    public static extern uint ovrp_GetStatus2(uint query);

    void Start () {
        Application.runInBackground = true; 
        SteamVR_Render.instance.pauseGameWhenDashboardIsVisible = false;
        ovrp_SetAppIgnoreVrFocus(true);
        //ovrp_GetStatus2(uint query);
        //m_vrCam.stereoTargetEye = StereoTargetEyeMask.None;
    }

1

Đầu vào SteamVR gần đây đã thay đổi hoàn toàn, giờ đây nó sử dụng Hành động và đây là hướng dẫn từng bước từ van về cách thiết lập nó.

Đây là một trong những cách (tốt nhất) để thăm dò ý kiến ​​trong mã:

    void Update(){


    //NOTE: I could have used one-off events. But I used these constant Update() polls instead because if the VR Dashboard is on while the headset is taken off or put on, 
    //then the OnDown and OnUp events get eaten by the dashboard and will never reach this code in unity. (github issue here: https://github.com/ValveSoftware/openvr/issues/628)

    // m_inputSourceDevice needs to be Any - there's no entry for "Headset", but the headset's sensors are reported under the Any "hand".
    SteamVR_Input_Sources m_inputSourceDevice = SteamVR_Input_Sources.Any;

    if(!m_isHeadsetOn && SteamVR_Input._default.inActions.Proximity_Sensor.GetState(m_inputSourceDevice)){
            Debug.Log("Headset On.");
            HeadsetOn();
    }
    else if(m_isHeadsetOn && !SteamVR_Input._default.inActions.Proximity_Sensor.GetState(m_inputSourceDevice)){
        Debug.Log("Headset Off (cancellable)");
        StartCoroutine(HeadsetOff());
    }

}

Lưu ý rằng ngay từ bây giờ, có một lỗi ngăn bạn sử dụng SteamVR để gán Cảm biến tiệm cận cho một hành động nếu bạn có HTC Vive hoặc Vive Pro, mặc dù trớ trêu là nó hoạt động như dự định nếu bạn đang sử dụng nó với Tai nghe Oculus. Có một sửa chữa dễ dàng trên trang vấn đề github steamvr này .

Cũng lưu ý rằng mặc dù sự hợp nhất dựng sẵn OpenVR thường thực hiện những gì SteamVR đưa ra, nhưng hiện tại nó không cho phép bạn truy cập vào cảm biến tiệm cận. Điều duy nhất bạn có thể làm với OpenVR là kiểm tra EDeviceActivityLevelnhư MichaelHouse đã giải thích trong câu trả lời của mình. Tuy nhiên, điều đó là vô ích vì mức độ duy nhất liên quan đến cảm biến prox là k_EDeviceActivityLevel_UserInteractionnhưng nó là sự kết hợp của cả prox và con quay hồi chuyển, vì vậy theo OpenVR, tai nghe luôn tương tác với người dùng mãi mãi chỉ cần một làn gió nhẹ hoặc rung động nghiêng tai nghe cứ sau 10 giây lại có một chút.

[BIÊN TẬP]

Trong khi đó, một số thứ đã được sửa. Ví dụ, bây giờ có một mục cho người H'mông, thay vì Bất kỳ; và OpenVR có giá trị XRDevice.userPresence (mặc dù nó có thể không rõ ràng là cảm biến tiệm cận).


Cảm ơn vì đã tạo ra một câu trả lời mới với thông tin mới nhất!
MichaelHouse

0

Đối với OVR ovr_GetSessionStatus()cho bạn biết điều này, OVRSessionStatuscó một lĩnh vực HmdMounted.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.