跳到主要内容虚幻引擎 Pico VR 开发:PicoXR 与 PicoOpenXR 插件及串流方式对比 | 极客日志C++
虚幻引擎 Pico VR 开发:PicoXR 与 PicoOpenXR 插件及串流方式对比
综述由AI生成对比了虚幻引擎中 PicoXR 与 PicoOpenXR 插件在 Pico 大空间 VR 开发中的差异。分析了 PDC、SteamVR 及 OpenXR 三种串流方式的性能、手势追踪支持情况及配置步骤。重点记录了不同插件组合下的打包兼容性、手势数据获取逻辑及常见调试问题,为开发者提供选型参考。
晚风叙旧24 浏览 概述
本文对比了虚幻引擎中 PicoXR 与 PicoOpenXR 插件在 Pico 大空间 VR 开发中的差异。分析了 PDC、SteamVR 及 OpenXR 三种串流方式的性能、手势追踪支持情况及配置步骤。
插件文档与下载
PicoXR 和 PicoOpenXR 文档
注意事项
- PicoXR 和 PicoOpenXR 两个插件不能同时启用,否则打包错误或者闪退。
- PicoOpenXR 插件在 UE5.3 版本曾用名 PicoForOpenXR。
- PicoXR 插件只适用于一体机 Android 打包,不可以打包 exe 进行 VR 串流。
- PicoOpenXR 可以 exe 和 apk 打包,都适用于大空间。
- 使用 PicoXR 插件时,也不能勾选 OpenXR 插件。
PicoXR v3.2.0
| 插件 | 说明 |
|---|
| OnlineSubsystemPICO | 平台服务功能相关的接口、蓝图和脚本 |
| PICOEnterprise | 面向企业设备提供的接口和脚本 |
| PicoSpatialAudio | 空间音频相关的接口和脚本 |
| PICOXR | 渲染、输入&追踪、环境感知及其它相关功能的接口 |
PicoOpenXR v1.5.0
Pico Live Preview v1.4.5
- 用于搭配 PDC 预览,可改用 SteamVR 串流或者 OpenXR 串流进行预览。
- 旧版本 v1.0.2 只适配到 UE5.3 版本,新版本升级适配到 UE5.5。
串流工具下载
SteamVR v1.27.5
安装 Steam,然后添加 SteamVR 安装。如果无联网环境,可下载离线安装包进行安装。
PDC v1.4.6
Pico 互联 v10.5.10
企业串流 v1.2.10
通用功能和实验室
1.2 版本比 2.0 实验版多了很多功能,但是少了 OpenXR 串流,只有 SteamVR 串流。
企业串流 v2.0
通用功能和实验室
2.0 比 1.2 少了很多功能,但是多了 OpenXR 串流方式,可以选择 SteamVR 或 OpenXR 串流。
串流方式选择
总结
- 使用 PicoXR+PicoLivePreview 插件的【PDC 串流调试】,最后安装 apk,再投屏到 PC 显示器实现伪串流。
- 使用 PicoOpenXR+OpenXR 插件的【Pico 互联】【企业串流 v1.2】【企业串流 v2.0】。
PDC 串流主要用于开发 apk 时,直接使用 PC 端进行串流调试。
三个串流应用安装时 PC 端和 apk 端的版本号要同步,而且必须 PC 和 apk 的应用名字相同才能配对串流成功。
- PicoXR 和 PicoOpenXR 插件互斥,只能选择其一。
- 如果想打包 Android,两插件选其一都能打包 apk。
- 如果想打包 exe,进行 PC 端的 VR 串流画面给头显,只有选择 OpenXR+PicoOpenXR。
- 安装 PC 端的 PDC、互联、串流软件时,关闭 PC 端的防火墙。
PDC 串流调试
想使用 PDC 串流,只能搭配使用 PicoXR + PicoLivePreview 插件,项目需求是打包 Android apk。
**理由:**虽然可以 PDC 串流时调用手势开发,但是 rhi 为 DirectX 11 和 PDC 串流使得显卡满载导致画面太卡出现拖影黑块,影响优化判断。
串流调试结束后,如果使用 PicoXR 插件打包 apk 时,需要切回 Direct12 和勾选实例化立体(Instanced Stereo)。
**注意:**使用 PDC 串流时,可以把企业串流或者 pico 互联的 app 和 exe 都关闭。
插件说明 PicoLivePreview
PicoLivePreview 是基于 PicoXR 的拓展插件。
UE5.15.3 使用的插件 PICO Live Preview Plugin-1.0.2
UE5.45.5 使用的插件 PICO Live Preview Plugin-1.4.5
**正确操作:**PDC 串流插件勾选 PicoXR + PicoLivePreview。
常见问题
- VR 预览按钮灰色失效:在 Unreal 项目编辑页面,确认工具栏中 Live Preview Link 为亮起状态。实时预览功能目前仅支持 DirectX 11 (DX11) 图形接口。
- 提示异常'串流运行时服务':可能为防火墙问题,关闭防火墙。可能是被其他应用占用服务冲突,关闭 PC 和一体机的'Pico 互联',关闭任务管理器 ps_service 进程并重启 PDC。
- PDC 串流导致显卡满载特别卡:有线 PDC 串流显卡满载 100%,建议切换至 SteamVR 串流。
企业串流 v2.0
使用 PicoOpenXR + OpenXR 插件 + OpenHandTracking。
**注意:**安装 企业串流 2.0.apk 后,如果一体机启动 企业串流 2.0.apk 闪退,可能是一体机的 Pico 互联.apk 占用端口了。
选择 OpenXR 串流
在企业串联 v2.0.exe 中,选择默认串流方式为 OpenXR 串流。
注意:如果切换串流方式后,还是无法 VR 运行后串流画面,可能是服务被占用,关闭企业串流应用后,关闭任务管理器的 ps_service 进程,然后通过 add_runtime.bat 强制切换为 OpenXR 串流方式。
串流成功效果图
PC 和一体机安装相同版本号的企业串流 v2.0。
企业串流 2.0.apk 中,选择有线连接或者 WiFi 连接都可以。
**注意:**如果页面中可连接设备一直无法刷新出设备,断开重新 usb 连接无效后,Pico 设备重启,PC 任务管理器把 ps_service 和 UE 应用进程都关闭,再启动企业串流 2.0.exe 和.apk 或电脑。
OpenXR 串流方式挺稳定的;SteamVR 串流更容易出现连接中断的小问题。
选择 SteamVR 串流
企业串流 v2.exe 中设置串流方式为 SteamVR 串流,其他操作与 OpenXR 串流方式相同。
或者使用 change_runtime_to_steamvr.bat 批处理 切换成 SteamVR 串流方式。
串流成功效果图
SteamVR 串流更容易出现连接中断的小问题。OpenXR 串流方式挺稳定的。
SteamVR 串流启动后,再启动 UE 项目才能正常 VR 预览调试;OpenXR 串流方式,启动项目就可以看到 VR 运行默认亮起。
企业串流 v1.2
使用 PicoOpenXR + OpenXR 插件 + OpenHandTracking。
注意:企业串流 v1.2 只有 SteamVR 串流,没有 OpenXR 串流,SteamVR 串流时手势追踪失败,手柄追踪正常。
卸载 2.0
使用 adb uninstall com.picoxr.bstreamassistant 卸载 2.0,pico 一体机自动回退成 v1.2 版本。
只有 SteamVR 串流
企业串流 v1.2 版本,无线和有线串流时,默认启动 SteamVR,无法用.bat 文件把串流方式改为 PicoOpenXR。
Pico 互联 v10.5.10
使用 PicoOpenXR + OpenXR 插件 + OpenHandTracking。
注意:群主视频使用普通版本一体机,在 Pico 互联 v10.5.10 版本中可以使用 OpenXR 串流。
企业一体机邪道安装 Pico 互联 V10.5.10 只能 SteamVR 串流,批处理修改 OpenXR 串流方式则串流失败。
企业版用户无法通过 pico 的应用市场更新 Pico 互联,可以从 p4 的一体机中,提取 apk 出来,再安装到 p4ue 一体机中。
企业版的 Pico 互联通过 开发者开启显示 互联应用。
开发者选项,点开设置→开发者→企业设置→基础设置(左侧第一个类选项)→系统应用→自定义资源库→打开互联的应用开关。
版本不对则提示更新,但是企业版无法应用市场更新 app。
手势追踪对比
总结
设备为企业版一体机 P4ue,串流基于企业串流 v2.0,企业串流 v1.2,Pico 互联 10.5.10。
- PDC 调试模式,使用 PicoXR 插件,项目 VR 运行时,PDC 串流调试时的手势追踪成功,打包 exe 无法 PC 串流。
- 无串流模式,使用 PicoXR 插件,打包 apk,手势追踪成功。
- 企业串流 v2.0,使用 PicoOpenXR 插件,打包 exe,在 OpenXR 模式,PC 串流的手势追踪成功。
- 企业串流 v2.0,使用 PicoOpenXR 插件,打包 exe,在 SteamVR 模式,PC 串流的手势追踪成功。
- 无串流模式,使用 PicoOpenXR 插件,打包 apk,手势追踪成功。
- 企业串流 v1.2,使用 PicoOpenXR 插件,打包 exe,只能 SteamVR 模式,PC 串的流手势追踪失败。
- Pico 互联 v10.5.10,使用 PicoOpenXR 插件,打包 exe,只能 SteamVR 模式,PC 串的流手势追踪失败。
PicoOpenXR 插件
插件勾选 OpenXR + PicoOpenXR + OpenXRHandTracking + (调试手指骨骼可视化 XR Visualization)。
手势组件层级结构
Hand Tracking Component PICO 为 PICO_HandTrackingComponent.h 的 C++ 基础组件。
Pico 默认手势组件。
添加两个 HandTrackingComponentPICO,分为左右手,进行手动参数配置(PicoXR 就提供了配置好参数的组件)。
OpenXR 串流手势成功
XR Visualization 手势可视化插件,显示手指骨骼位置用方块示意,打包不支持 shipping 模式,左右眼有坐标系差别。
DrawDebugCoordinateSystem 蓝图接口仅调试,显示手指骨骼位置用坐标系示意,打包不支持 shipping 模式。
**注意:**OpenXR 串流时默认无法在手势追踪时同步给 MotionController 坐标,因为此时的 MotionController 的动作源 MotionSource 为 LeftGrip,改为 LeftWrist 即可。
对比打包 apk 时,MotionController 的 VR 默认机器手掌模型使用 LeftGrip 导致坐标有偏差,需要根据项目需求调整 MotionSource 动作源和偏移量。
SteamVR 串流手势成功
SteamVR 串流,可以查看是否捕获到手势追踪。
**注意:**SteamVR 串流时,MotionController 默认使用 LeftGrip 也可以同步手势坐标,Pico 手掌和 MotionController 机器手掌坐标近似。
对比 OpenXR 串流时无法获得 MotionController 的 LeftGrip 动作源坐标。
打包 apk 时,MotionController 的 VR 默认机器手掌模型使用 LeftGrip 导致坐标有偏差,需要根据项目需求调整 MotionSource 动作源和偏移量。
常见问题
如果不勾选 手势追踪插件 OpenXRHandTracking,只勾选 OpenXR + PicoOpenXR 插件。
PC 串流条件下,只能识别到 Pico 系统级别的手势追踪捕获的手掌心,和手势追踪捕获到真人手掌即将靠近安全区域的警告。没有捕获手指头骨骼节点的坐标。
安卓打包条件下,系统手势追踪不仅有捕获到手掌心,还把手掌坐标映射给了 MotionController,所以同步了 VR 默认模板的机器手掌模型坐标。没有捕获手指头骨骼节点的坐标。
ps.掌心朝内握拳触发关闭应用;掌心朝内握拳再保持握拳掌心朝外触发重置坐标手势。企业版本一体机可以关闭这个手势,因为掌心朝内握拳的事件太容易触发了。
优化移动光照偏灰
PC 和移动端的光照环境的色差问题,打包 apk 的画面默认偏灰。
- 修改预览设置改为 Android Vulkan Mobile,此模式下无法使用地编功能,画面偏灰。
- 添加后处理,把自动曝光改为手动,并修改曝光补偿为 10。
- 打包 apk 后,关闭自动曝光的环境光照色差和 PC D3D SM6 预览 和 PC Android Vulkan Mobile 预览近似。
优化机器手掌朝向
VR 机器手掌模型,默认 y 轴正向。
Pico 新版本手掌模型,默认 x 轴正向。
VR 模板中默认左右手掌模型的偏移量。
MotionController 组件的 OpenXR 默认动作源:LeftGrip 和 RightGrip。
OpenXR
LeftGrip 动作源模式下,手掌 HandLeft 默认坐标系,手柄追踪时的机器手掌模型位置正确;手势追踪时无手掌模型但是可以用 Pico 手势追踪组件的手掌模型。
用手势追踪驱动 MotionController 的理由是很多 VR 模板都是操作 MotionController 的手掌/手柄模型。
按照 PicoOpenXR 文档,驱动 Motion Controller 的动作源改为 Left Wrist,此时手势追踪时有默认机器手掌模型和 Pico 手掌模型跟随追踪坐标,但是手柄追踪时则无数据且 Pico 手掌留在丢失追踪坐标的位置,需要动态修改动作源。
因为机器手掌默认 y 朝向,要匹配成 Pico 手掌位置的默认 x 朝向,所以机器手掌的相对旋转绕 z 轴旋转 -90°。
手柄追踪时,pico 手掌模型丢失追踪目标坐标,停留在原地。
注意动态修改数据源时:
Left false Hand
Right false Hand
无手势无手柄 False Hand
手柄追踪时为 False Hand
手势追踪时为 True Hand
暂时不了解 OpenXR 串流时,手柄追踪时也是返回 Hand。
SteamVR
和 OpenXR 串流时返回值不一样:
无手势无手柄 False Hand
手柄追踪时为 true Hand 【不一样】
手势追踪时为 True Hand
如果用 OpenXR 串流的坐标系,手势追踪时,MotionController 控制的机器手掌有偏移误差,需要微调。
手柄追踪时,pico 手掌模型追踪手柄坐标,手柄按键可以控制 MotionController 的机器手掌和 Pico 组件的手掌模型的握拳动画。
Android PicoOpenXR
Android PicoXR
MotionControl 的 MotionSource 为 Left 和 Right。
驱动 MotionController 的机器手掌模型时,其偏移量比较特殊。
和 OpenXR 串流时返回值不一样:
无手势无手柄 true Controller
手柄追踪时为 true Controller
手势追踪时为 true Controller
手势追踪时,MotionController 的机器手柄丢失追踪模板,停留在原地。
PicoXR 插件
插件勾选 PicoXR,关闭 OpenXR,关闭 PicoLivePreview。
项目设置里--PicoXR Settings 在 控制器(Controller)下,将 HandTracking Support 设置为 Controllers and Hands 或 Hands Only。
手势追踪功能仅支持 64 位应用开发,使用前请确保在 编辑 > 项目设置 > 平台 > Android > 构建 下勾选 支持 arm64 并取消勾选 支持 armv7。UE5 中已默认勾选 支持 arm64。
手势组件层级结构
PICOXRHand Compoenet 为 PXR_HandComponent.h 的 C++ 基础组件。
└─ BP_XRHandComponent 挂载了 BP_Ray 对象,用于每帧显示白色箭头,手势捏 Pinch 时变化箭头形态。
└─ BP_XRHandComponent_Left | BP_XRHandComponent_Right 默认配置了左右手的骨骼名映射。
使用 Pico 默认手势模型 BP_XRHandComponent_Left | BP_XRHandComponent_Right 的 Bone Name Mappings 左右手骨骼映射。
((Palm, "left_palm"),(Wrist, "left_wrist"),(ThumbMetacarpal, "left_thumb_metacarpal"),(ThumbProximal, "left_thumb_proximal"),(ThumbDistal, "left_thumb_distal"),(ThumbTip, "left_thumb_tip"),(IndexMetacarpal, "left_index_metacarpal"),(IndexProximal, "left_index_proximal"),(IndexIntermediate, "left_index_intermediate"),(IndexDistal, "left_index_distal"),(IndexTip, "left_index_tip"),(MiddleMetacarpal, "left_middle_metacarpal"),(MiddleProximal, "left_middle_proximal"),(MiddleIntermediate, "left_middle_intermediate"),(MiddleDistal, "left_middle_distal"),(MiddleTip, "left_middle_tip"),(RingMetacarpal, "left_ring_metacarpal"),(RingProximal, "left_ring_proximal"),(RingIntermediate, "left_ring_intermediate"),(RingDistal, "left_ring_distal"),(RingTip, "left_ring_tip"),(LittleMetacarpal, "left_little_metacarpal"),(LittleProximal, "left_little_proximal"),(LittleIntermediate, "left_little_intermediate"),(LittleDistal, "left_little_distal"),(LittleTip, "left_little_tip"))
((Palm, "right_palm"),(Wrist, "right_wrist"),(ThumbMetacarpal, "right_thumb_metacarpal"),(ThumbProximal, "right_thumb_proximal"),(ThumbDistal, "right_thumb_distal"),(ThumbTip, "right_thumb_tip"),(IndexMetacarpal, "right_index_metacarpal"),(IndexProximal, "right_index_proximal"),(IndexIntermediate, "right_index_intermediate"),(IndexDistal, "right_index_distal"),(IndexTip, "right_index_tip"),(MiddleMetacarpal, "right_middle_metacarpal"),(MiddleProximal, "right_middle_proximal"),(MiddleIntermediate, "right_middle_intermediate"),(MiddleDistal, "right_middle_distal"),(MiddleTip, "right_middle_tip"),(RingMetacarpal, "right_ring_metacarpal"),(RingProximal, "right_ring_proximal"),(RingIntermediate, "right_ring_intermediate"),(RingDistal, "right_ring_distal"),(RingTip, "right_ring_tip"),(LittleMetacarpal, "right_little_metacarpal"),(LittleProximal, "right_little_proximal"),(LittleIntermediate, "right_little_intermediate"),(LittleDistal, "right_little_distal"),(LittleTip, "right_little_tip"))
默认手势触发 捏 Pinch
输入映射上下文 InputMappingContext 中添加左手'捏'手势事件,弹出 Menu 菜单。
PDC 串流,PicoXR 插件+PicoLivePreview 插件,手势捏 Pinch 事件开启 Menu 菜单。
MotionController 组件的默认动作源:LeftGrip 和 RightGrip。
常见问题
PicoXR 手势追踪时无控制器数据
因为 MenuUI 挂载在 VR 模板的控制器 MotionController 上,在 PDC 串流或者 apk 真机运行时,使用 PicoXR 的手势追踪时,MotionController 动作源为 LeftGrip 时获取不到数据。
使用 Pico 手柄时,MotionController 正常获取数据。当重新捕获手势追踪时,PDC 串流模式下手柄控制器数据归 0,UE 手掌模型位置归 0;apk 真机手柄位置固定在历史位置。
需要修改 MotionController 的 MotionSource 动作源为 Left。
如果抄 PicoOpenXR 手势追踪文档的蓝图代码,最开始以为能共用,但是 Get Motion Controller Data 获取 Device Visual Device 数据只有 true Controller,没有 Hand。
PicoOpenXR 手势追踪教程 UE5.3
- 勾选插件 OpenXR + PicoOpenXR。
OpenXR_HandTracking 插件 ,
XR Visualization , (可视化插件用于画小方块,不支持 shipping 模式,左右眼有视差)
Bug:UE5.1 旧版本拉丝是因为 pico 在 26 个节点有 4 个不可用,0 掌心,6 食指掌骨,11 号中指掌骨,16 号无名指掌骨,和 Tip;新版本骨骼完善不用删除。
- 查找 XR_EXT_hand_tracking 12.36 可以查阅哪些设备支持。
查找 Conventions of hand joints。
-
勾选 Is Hand Tracking Used,Pico 应用市场可以识别支持手势(不勾选也能用)。
-
MotionController 选择 LeftWrist 和 RightWrist(从 PicoXR 改为 PicoOpenXR 时需要注意修改,变量不同)。
没有掌心,不能用 palm。
-
手掌朝上,掌心朝内 (Pitch=0.000000,Yaw=90.000000,Roll=-90.000000) 新版本 Row 不用转。
旧版本 UE5.3 的 Pico 默认手掌朝向为 X 轴负方向,且骨骼节点命名与现在不同。
-
为了驱动骨骼,不驱动 MotionController,从 RightWrist 改为 Right,目的是测试,避免影响到 Pico 手掌模型的观察。
-
在 DefaultRoot 节点添加 PicoHand 组件 HandTrackingComponentPICO,骨骼选择 Pico 默认骨骼。
组件:HandTrackingComponentPICO 和 方法"GetMotionControllerData" 手势数据 都正常支持。
(picoXR 的 PICOXRHand 和 BP_XRHandComponent_Left 支持手势追踪,PicoXR 无法使用 GetMotionControllerData,打包 apk 和 pdc 的 VR 预览都不支持)
Apply Location to Every Bone 用于匹配大人小孩手指头长短。
Auto Hide 未识别到手势自动隐藏。
-
BoneMapping 骨骼映射。
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online