簡體   English   中英

麻煩理解 OpenVR 驅動 API

[英]Trouble understanding OpenVR driver API

我的最終目標是制作一個 VRidge 輕量級克隆來理解 OpenVR API,但我很難理解如何讓我的代碼顯示一些東西。 作為一個起點,而不是我的手機,我想創建一個 window 作為 HMD(SFML,SDL,你的名字......)並讓 SteamVR 在其中渲染 VR 視圖。

我知道實現IServerTrackedDeviceProvider的 object 是我的驅動程序設備的處理程序, ITrackedDeviceServerDriver是設備本身的接口,我懷疑我的“HMD”設備必須實現IVRDisplayComponent

除了設置一些屬性並使用回調來激活和停用我的設備之外,我不知道從哪里獲得要在屏幕上顯示的實際幀。 我錯過了什么?

你幾乎是對的。

繼承vr::IServerTrackedDeviceProvider的 class (我稍后將其稱為設備父級)負責注冊和維護設備的生命周期(創建、注冊等)

在設備父設備注冊后繼承vr::ITrackedDeviceServerDriver的類被視為被跟蹤設備,設備類型由設備父設備在注冊時設置,同樣在 HMD 設備GetComponent()方法需要返回顯示組件的情況下,如果請求, 對於其他設備,它可以只返回NULL

GetComponent()接收帶有組件名稱和版本的 c 字符串,例如存儲在vr::IVRDisplayComponent_Version中的"IVRDisplayComponent_002" ,如果設備具有匹配名稱版本對的組件,則需要返回指向它的指針,如果沒有找到匹配返回NULL

同樣關於組件,在 Valve 以非常懶惰和糟糕的方式提供其完成的驅動程序示例中,請勿將組件繼承到您的設備類

將您的組件分割成您在設備中初始化的單獨對象,並相應地在GetComponent()中返回它們

現在,讓 SteamVR 正確識別和使用您的設備的唯一事情就是注冊它們,但有一個問題,您需要在注冊時指定設備類型,方法是傳遞來自vr::ETrackedDeviceClass枚舉的值之一(當您查看枚舉時,這些應該是不言自明的)

當然,這並不是 openvr 驅動程序的全部內容,為了讓所有這些都正常工作,並且 SteamVR 甚至要確認您的驅動程序的存在,您需要實現一個HmdDriverFactory() function,它類似於GetComponent() ,除了您將輸入 c 字符串與提供者名稱版本對,如果是設備父級,則為vr::IServerTrackedDeviceProvider_Version ,如果匹配,則返回指向設備父級實例或您實現的任何其他提供者的指針

幾點注意事項:

  • HMD至少需要一個顯示組件
  • HMD設備對你如何提交姿勢非常敏感(不要問為什么,就是這樣)
  • 為缺乏文檔做好准備,您將獲得的最佳文檔是 openvr_driver.h 中的代碼注釋、 openvr_driver.h ValveSoftware/openvr問題跟蹤器和其他使用 openvr 驅動程序的人(即使只有少數......)

這不是對 openvr 驅動程序如何工作的最佳解釋,因此歡迎您在評論中詢問更多詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM