VR:MotionController与插件

前言

VR设备种类繁多, 而且因为OpenXR的推出, 各种设备都有自家版本和OpenXR版本的插件, 当中也有很多差异, 所以本文记录一下开发VR时, MotionController与插件之间的关系

我们以4.27Plus版本引擎测试, 创建默认的VR模板项目

看到插件页面, 模板统一使用了OpenXR的环境, 像SteamVR和OculusVR都没有开启

image-20221123161825982

下面具体对比一下当中的差别

坐标系

设备自家的插件形态各异

OpenXR的设备信息统一成了一直的3个, 即下图中的几个

image-20221123191715534

从代码中也可以看到

image-20221123191743054

先看steam家的指虎手柄, 也就是ValveIndex头显配套的手柄的位置信息

Valve Index

先看OpenXR

image-20221123191627014

Aim的位置在手柄外, 朝向接近于顶部面板的切线方向,

另外两者都是手柄抓握的地方, 接近于质心的位置

在蓝图里的预览视图内, 如果把OpenXR插件内的预览模型直接拖进去, 那么位置就是我们运行时的位置

image-20221123192126598

然后是SteamVR的

屏幕捕获_2022_11_24_14_55_03_30

看一下SteamVR的代码可以看到

image-20221123203418593

一般, 有用的只有Left和Right

Tracker应该是Vive自己的追踪器设备, 没有条件测试就先略过

按上图中显示, 只有一个位置, 这个质心是在手柄顶部, 这个就不太友善了, 需要做额外的位置匹配

目前版本的SteamVR控制器位置信息会覆盖掉OpenXR的信息

不知道V社这么想的……这个位置是干啥的…

HTC Vive

屏幕捕获_2022_11_23_19_36_32_187

屏幕捕获_2022_11_23_20_31_52_682

前者是OpenXR的, 后者是SteamVR

Oculus

Oculus的插件有OculusVR和OculusOpenVR, 目前是2选1的情况, 先看OculusOpenXR

Oculus只有Quest2做测试, Quest比较特别, 如果开启的是OculusOpenXR的话没有办法直接通过引擎编辑器进入VR预览(开OculusVR就可以), 那么只有打包出来看

然后如下图

屏幕捕获_2022_11_23_20_12_21_457

实际效果与Index很接近, 但是遇到了一个可能是渲染Bug, 左眼一切正常, 右眼的Trigger的位置(上图中的球)是有偏差的, 导致上图中的球看上去不正常, 实际测试了一下逻辑是对的, 包括箭头也是正确的

用蓝图预览试图中模拟一下, 效果大概就是打包以后的效果

image-20221123201930770

然后是Oculus自家的VR, OculusVR

屏幕捕获_2022_11_24_14_29_20_308

位置和朝向都跟前者不一样

而且只有一个Left和Right的位置信息, 其他的都没有

image-20221124144553907

其他

OpenXR和SteamVR下的HTC Vive和Index按键基本上都能获取到

但是2种环境下, Index的触摸板Trackpad只能检测到Axis的X和Y, 以及Action中的Touch事件, 上下左右4个反向的按下都无法接收(虽然这么小的一个触摸板确实很难保证不误触)

总结

目前版本而言, 但从MotionController的角度看(其实还有一些渲染选项问题, 暂略), 似乎SteamVR可以被OpenXR完全取代

但是Oculus这一分支还只能用OculusVR, 毕竟不能每次调试都打包一次. 而且Meta官方建议也是开启OculusVR, 估计是OculusOpenXR还不够完善吧