最近有个想法,能不能给 Kiwi 加上 WebXR 的界面,就能在 VR 页面里打开很多 item 然后排序了。
配置: Chrome v101 + SteamVR + Valve Index
WebXR 浏览器兼容性:
Chrome 支持详情:
https://immersiveweb.dev/chrome-support.html
现在已经默认开启支持了,不放心也可以在 chrome://flags/ 里面显示开启。
Chrome 底层用的 OpenXR , SteamVR 提供了一个 OpenXR 的 Runtime,需要 follow 这里 的说明,在 steam library 中开启 steamvr 的 beta 版,之后 steamvr 会自动更新,在使用的时候需要先打开 steamvr,浏览器才能检测到设备。
MDN 有一个写的非常好的介绍 Fundamentals of WebXR ,来自一个教程系列。 WebXR 主要提供了一些设备相关的 API,可以读取一些设备状态和交互,至于渲染和绘图是开发者的事情,可以利用 WebGL 实现。 目前有三种模式,inline(vr), immersive-vr, immersive-ar。 inline 就是网页上一个 canvas,类似于 fallback 的感觉,immersive 模式是要点击进入 vr/ar 模式,然后浏览器请求权限,然后在设备上渲染。
怎么绘图呢? 最开始想到的就是直接把 kiwi 上面渲染出来的 div 元素直接放到里面,毕竟是浏览器还是有这个优势的。 就关于这个操作是否可行做了一系列调查。 之后发现这个事情还在推进中。
把 dom 渲染在 immersive 模式下主要是为了 ar 模式服务,方便在上面做一些 ui,至于后面是否会迁移到 immersive-vr 模式还有待商榷:
关于这个问题,有一个比较直接的问答:
https://discourse.threejs.org/t/active-html-in-vr/32329
用 css3d 可以在 canvas 顶上放 html 元素覆盖,当然这个元素属于浏览器直接渲染到屏幕的,一个例子就是 https://xenzvr.com/ ,在 e room 有隐藏房间。(需要确认一下 inline 模式是不是单纯一个 canvas,好像和 three.js 啥的效果没区别啊) 但是 vr 设备只能输出 webgl 的画面,没有办法利用到这个特性。
回答是不可以。 要么用 hack 要么用不依赖于 html/css 的 gui(在 3d 世界自己实现)。 这里 未来可能会加一个 dom layer 来做这个事情,可能今年(2022)年中就能上线,未来还是光明的。
上面提到的 hack 方式也值得深挖,不过这个实现看起来并不能很好的推广到任意 html 元素。