5.进阶功能

该章节主要展示在了解SDK基础功能的基础上,需要进一步了解的功能,例如性能优化,URP的使用,大空间定位等等

5.1 性能优化

RhinoX 搭载高通835芯片。在启动MR应用以后, 需要负荷的基线计算量包括: 头部6dof位置跟踪, 双目渲染, X-Tag跟踪算法, 所以相对于手机应用而言,其性能天花板是比较低的。

5.1.1 性能要求

帧率

RhinoX应用帧率不得低于50帧,建议55帧以上

场景

同屏模型三角面片控制在60万以内

尽量不使用点光源。 Directional Light 场景中建议最多使用一个。

不建议使用 Unity 的 Standard PBR shader , 如果要使用光照shader, 建议使用 Mobile 类的shader.

5.1.2 优化方法

  1. 使用通用渲染管线(URP)可以极大的提升性能。

  2. 在保证显示的情况下减少模型面片顶点数量

  3. 尽量共用材质,动画

  4. 尽量使用压缩纹理格式

  5. 尽可能少的使用灯光特效等

  6. 尽量使用静态批处理

  7. 脚本优化,减少不必要内存,计算等资源消耗

  8. 使用 lightmap 代替 实时光。

  9. 对于自定义shader, 不要在像素片段中大量使用exp(), pow()等对GPU造成高负荷的函数。

  10. 减少使用后处理。

  11. 如果项目中需要用到骨骼动画, 在项目设置中将 Skin Weights 设置为 2 Bones, 不要设置为 4 Bones 或者 Unlitmited。

5.2 使用URP渲染管线

5.2.1 使用URP渲染管线的好处

极大的提升算力天花板

不使用URP的情况,在Unity Shader着色器渲染的情况下, 要保持帧率大于50,最多支持60万面。 使用了URP之后,同样的着色器渲染,能最多支持100万面的渲染并保持50的帧率。

能支持更多的实时光

由于URP的实现机制决定了, 多光源渲染的场景在URP下不会像Builit管线那样造成大量的额外Drawcall, URP管线非常适合使用多实时光源的场景。

5.2.2 如何使用URP

示例项目请直接导入SDK压缩包中的2019版本即可

_images/SDK_download.png

操作步骤

  1. 在PackageManager上, 导入 2019.4 版本对应的URP插件包

_images/PackageManager_URP.png
  1. 在项目资源中,创建 Universal Rendering Pipeline / Pipeline Assets (Forward)

_images/CreateURPAsset.png
  1. 将创建的 Pipeline Assset 放置到 Project Setting/Quality 的Rendering 栏目, 和 Graphics 的 Scriptable Render Pipeline Assets 栏目下。

_images/URP_Quality.png _images/URP_Graphics.png
  1. 编译apk即可,ARCamera 的渲染流程内置已经支持了 URP 。

什么样的项目建议使用 URP

  1. 新立项的项目。 考虑到将PBR shader 转换到 URP shader 的实现成本, 旧的项目迁移到 URP 所花的的时间是比较多的。

  2. 渲染任务较重,而又不方便使用无线串流实现的项目。

  3. 需要比较多实时光模拟真实光的项目。

5.3 使用 Unity Editor Debugger调试

5.3.1 功能介绍

有许多初次使用RhinoX的开发者, 尤其是过去使用VR设备开发的开发者, 都面临一个问题, 就是无法像VR设备一样, 在unity环境内模拟MR设备进行调试工作。

Unity Editor Debugger 就是为了解决这个问题。 Unity Editor Debugger 的设计初衷是成为开发者的效率工具。让开发者可以不需要编译-安装apk, 直接在Unity环境下运行当前的场景,并且可以直接看到 ARCamera ,RxController等重要对象的位置,按键状态等属性。

_images/demo_debugger.gif

5.3.2 如何使用

  1. 从SDK库上获取到v1.5的 RhinoX SDK

Unity Editor Debugger 的库位于 : Plugins/Unity2018.4/UnityDebugger下

_images/UnityEditorDebugger.png
  1. 在场景中创建Debugger对象, 并添加 EditorDebugger 组件

_images/AddsEditorDebugger.png
  1. 安装 RhinoX Debugger.apk

下载地址:

https://doc.ximmerse.com/release/unitysdk/RhinoX_Debugger.apk

  1. 确认头显和电脑处于同一局域网,且能互相ping通

  2. 在Unity中点击 Play 按钮

  3. 在头显中启动 RhinoX Debugger应用

  4. 在Unity中,选中 Debugger 对象,在查找到的设备项上,点击Connect

_images/ConnectsEditorDebugger.png

也可以直接输入头显的IP地址,再点击连接:

_images/RhinoX_Debugger_Input_IP.png

如果成功连接, 头显上会显示出编辑器上相机的画面。

注解

如果在电脑上无法连接到头显,请检查是否打开了Windows防火墙。 如果是, 需要允许Unity Editor应用使用网络, 或者关闭防火墙。

目前该工具体验还存在一些问题,如果调试起来确实不方便,麻烦您先放弃此功能。

5.4 使用大空间融合定位算法

5.4.1 背景

注解

大空间融合定位算法要求 v1.5 或以上的RhinoX MR SDK支持。

大空间融合算法是Ximmerse研发部门为了解决旧sdk中的一些问题,而开发出的新一代空间定位算法。

v1.5以前的SDK,在使用 GroundPlane 和 ARCamera 组件定位用户头部6DOF位置的时候,

存在以下问题:

1). 使用GroundPlane组件定位用户位置的精度不高, 每次定位的结果之间都会有一定的偏移。

2). 每次定位的时候, ARCamera 实际上是被瞬间放置到计算出的6dof位置上, 用户会有“画面跳动”的感觉。

v1.5 SDK引入了 Fusion 算法解决上述问题。

5.4.2 使用方法

大空间融合算法其实就是在场景中创建多个GroundPlane,根据实际情况,将他们均匀布置在实际场地中,以此来达到保证定位精度 的效果,具体使用步骤如下:

  1. 首先升级到 v1.5 SDK

  2. 在Unity工具栏,打开 Edit/Project Setting,并切换到 RhinoX Setting 选项卡。

确保 Ground algorithm 字段的设置为 Fusion

_images/project_setting_v1.5.png

注解

如果 Ground algorithm 字段的设置为 Legacy, 则GroundPlane组件会使用旧的非融合版本的定位算法。 现阶段 Fusion 还处于大规模测试阶段,如果您的项目已经在生产环境验证了结果, 可以继续使用 Legacy 定位算法。

  1. 在场景中添加一个空的GameObject,在该GameObject上添加CreatesGroundPlaneByJson脚本。

_images/bigspace.png
  1. 将名称为GroundPlaneConfig.json的文件按如下格式配置好之后,放到头显的sdcard根目录下

{
    "items": [
        {

            "beacon_id": 65,
            "group_id": 1,
            "position": {
                "x": 0.0,
                "y": 0.0,
                "z": 0.0
            },
            "rotation": {
                "x": 0.0,
                "y": 0.0,
                "z": 0.0
            },
            "coord_system_flag": 0,
            "confidence_thresh": 0.8500000238418579,
            "max_distance_thresh": 3.0,
            "min_distance_thresh": 0.20000000298023225,
            "drift_recenter_angle_threshold": 28.0,
            "drift_recenter_distance_threshold": 0.75
        },
        {
            "beacon_id": 66,
            "group_id": 1,
            "position": {
                "x": 1.0,
                "y": 0.0,
                "z": 0.0
            },
            "rotation": {
                "x": 0.0,
                "y": 0.0,
                "z": 0.0
            "coord_system_flag": 0,
            "confidence_thresh": 0.8500000238418579,
            "max_distance_thresh": 3.0,
            "min_distance_thresh": 0.20000000298023225,
            "drift_recenter_angle_threshold": 28.0,
            "drift_recenter_distance_threshold": 0.75
        }
    ]
}

beacon_id 为定位板的ID

group_id 用来对定位信标进行分组,所有定位信标应保持一致

position/rotation 表示GroundPlane的Transform信息,按照GroundPlane在场景中的实际坐标来设置

max_distance_thresh 表示最远跟踪距离

min_distance_thresh 表示最近跟踪距离

其他值可参照GroundPlane章节介绍,保持默认值即可

注解

Legacy 模式下, GroupID字段会被隐藏。

5.5 使用环形控制器

注解

环形控制器要求 v1.5 或以上的RhinoX MR SDK支持。

v1.5 SDK 兼容了对RingController 和 TagController(上一代方形控制器)的支持。

要使用控制器,只需要拖动如下两个Prefab到场景中:

Assets/Plugins/RhinoX/Assets/RhinoX Hand/RxPlayerHand-LeftHand.prefab 和 RxPlayerHand-RightHand.prefab 这两个prefab , 代表左右手

_images/RxPlayerHand.png

如果要替换手部模型, 只需要替换 Hand_R_Pose 和 Hand_L_Pose 即可。

注解

Hand_R_Pose/Hand_L_Pose 模型对象上的 PlayerHandAnimator 组件不是交互功能必须的组件,替换模型的时候, 开发者可以自己决定是否保留。

在替换模型的时候, RxPlayerHand-RightHand/RxPlayerHand-LeftHand 上的组件需要保留, 否则可能导致交互功能不正常。

如果自定义控制器射线

在 RxPlayerHand-RightHand 对象上,有一个 组件 RxControllerAdapter:

_images/RxControllerAdapter.png

此组件根据所连接的控制器类型,决定模型和射线的锚点。 环形控制器和旧的方形控制器的射线方向是不一样的。

Hand Anchor_TagController 和 Raycast Anchor_TagController 这是方形控制器的模型和射线锚点。

Hand Anchor_RingController 和 Raycast Anchor_RingController 这是环形控制器的模型和射线锚点。

开发者可以根据自己的实际情况, 改动这两个锚点位置。