你几乎是对的。
一个继承类vr::IServerTrackedDeviceProvider
(我稍后将其称为设备父级)负责注册和维护设备的生命周期(创建设备、注册设备等)
在设备父设备注册后继承vr::ITrackedDeviceServerDriver
的类被视为被跟踪设备,设备类型由设备父设备在注册时设置,如果 HMD 设备GetComponent()
方法需要返回显示组件,如果请求,对于其他设备它可以只是返回NULL
GetComponent()
接收带有组件名称和版本的ac字符串,例如"IVRDisplayComponent_002"
存储在vr::IVRDisplayComponent_Version
NULL
同样关于组件,在 Valve 以非常懒惰和糟糕的方式提供其完成的驱动程序示例中,请勿将组件继承到您的设备类
将您的组件分割成您在设备中初始化的单独对象并GetComponent()
相应地返回它们
现在,让 SteamVR 正确识别和使用您的设备唯一剩下的事情就是注册它们,但是有一个问题,您需要在注册时指定设备类型,方法是传递vr::ETrackedDeviceClass
枚举中的一个值(这些应该是当您查看枚举时,非常不言自明)
当然,这并不是 openvr 驱动程序的全部内容,为了让所有这些都正常工作,并且为了让 SteamVR 甚至承认你的驱动程序的存在,你需要实现一个HmdDriverFactory()
函数,它类似于GetComponent()
除了你将输入 c 字符串与提供程序名称版本对进行比较和在设备父级的情况下vr::IServerTrackedDeviceProvider_Version
,如果您获得匹配,则返回指向您的设备父级或您实现的任何其他提供程序的实例的指针
几点注意事项:
- HMD至少需要一个显示组件
- HMD设备对你如何提交姿势非常敏感(不要问为什么,就是这样)
- 为缺乏文档做好准备,你会得到的最好的文档是代码注释
openvr_driver.h
,ValveSoftware/openvr
问题跟踪器和其他使用 openvr 驱动程序的人(即使只有少数......)
这不是对 openvr 驱动程序如何工作的最佳解释,因此欢迎您在评论中询问更多详细信息