Table of Contents

Unity 中的自定义相机实现 —— 外部帧数据源

通过外部帧数据源(ExternalFrameSource),开发者可以为 EasyAR Sense 扩展自定义的相机实现,从而支持特定的头显设备或其它输入设备。以下内容介绍了外部帧数据源的类型结构及接口定义。

开始之前

外部帧数据源类型

---
  config:
    class:
      hideEmptyMembersBox: true
---
classDiagram
  class FrameSource {
    <<abstract>>
  }
  class ExternalFrameSource {
    <<abstract>>
  }
  class ExternalDeviceFrameSource  {
    <<abstract>>
  }
  class ExternalDeviceMotionFrameSource:::EasyAR {
    <<abstract>>
  }
  class ExternalDeviceRotationFrameSource:::EasyAR {
    <<abstract>>
  }
  class ExternalImageStreamFrameSource:::EasyAR {
    <<abstract>>
  }

  ExternalFrameSource --|> FrameSource
  ExternalDeviceFrameSource --|> ExternalFrameSource
  ExternalDeviceMotionFrameSource --|> ExternalDeviceFrameSource
  ExternalDeviceRotationFrameSource --|> ExternalDeviceFrameSource
  ExternalImageStreamFrameSource --|> ExternalFrameSource
  
  classDef EasyAR fill:#6e6ce6,stroke:#333,color:#fff

上图展示了外部帧数据源的类型结构。

根据输入数据的不同,外部帧数据源可以分为两大类:

  • 图像和设备运动数据输入扩展
    • 通过继承 ExternalDeviceMotionFrameSource 实现:设备及设备 SDK 提供 6DoF 运动跟踪功能。虚拟摄像机的 transform 及其它控制由设备 SDK 完成。
    • 通过继承 ExternalDeviceRotationFrameSource 实现:设备及设备 SDK 提供 3DoF 旋转跟踪功能。虚拟摄像机的 transform 及其它控制由设备 SDK 完成。
  • 图像输入扩展

接入这几种外部帧数据源时,可以使用的 AR 功能有所不同:

  • 图像和设备运动数据输入扩展 ExternalDeviceMotionFrameSource
    • Mega
    • 运动跟踪(由设备自身提供)
    • 稀疏空间地图
    • 稠密空间地图
    • 图像跟踪(支持运动融合)
    • 图像云识别
    • 物体跟踪(支持运动融合)
  • 图像和设备运动数据输入扩展 ExternalDeviceRotationFrameSource
    • Mega
    • 图像跟踪(不支持运动融合)
    • 图像云识别
    • 物体跟踪(不支持运动融合)
  • 图像输入扩展 ExternalImageStreamFrameSource
    • 图像跟踪(不支持运动融合)
    • 图像云识别
    • 物体跟踪(不支持运动融合)

外部帧数据源接口定义

创建外部帧数据源时,必须实现相关接口。下面介绍了这些接口的定义及使用方法。

设备定义

可用性

  • FrameSource.IsAvailable可用性(Availability)
    用于判断 frame source 是否可以使用。
    如果一个 frame source 在当前运行设备或环境下不可用,该数值应为 false。
    如果该数值等于 Optional<bool>.Empty,FrameSource.CheckAvailability() 协程会被调用,应在协程结束前更新 FrameSource.IsAvailable
    可用性接口会在 session 组装时使用,不可用的组件将不会被选择且它的方法在 session 运行时不会被调用。
  • FrameSource.CheckAvailability()(可选):检查 frame source 是否可用的协程
    FrameSource.IsAvailable 等于 Optional<bool>.Empty 时会被调用。在该协程结束前,session 的组装过程会被阻塞。

session 原点

虚拟摄像机

  • FrameSource.Camera虚拟摄像机
    摄像机不受 session 控制,摄像机的 transform 和投影矩阵以及图像背景渲染应由外部代码控制。
    仅在头显上该摄像机会被使用,用于将一些诊断文字展示在眼前。
    ExternalDeviceFrameSource.OriginTypeXROrigin 时不需要定义,EasyAR 会自动使用 Unity XR 框架中定义的相机。

物理相机

物理相机参数需要与真实设备相机相同。

session 启动和停止

  • FrameSource.OnSessionStart(ARSession)处理 session 启动事件
    在 session 组装时选择了这个 frame source 时有效。
    可以用于延迟初始化,在这个方法中进行 AR 独有的初始化工作。
  • FrameSource.OnSessionStop()处理 session 停止事件
    在 session 组装时选择了这个 frame source 时有效。
    可以在这个方法中销毁 FrameSource.OnSessionStart(ARSession) 以及 session 运行中创建的资源并恢复内部状态。在 session 销毁之前这个方法会被保证调用。如果 frame source 在 session 之前销毁,它将不会被调用,且 session 将进入 Broken 状态。

输入帧

  • ExternalFrameSource.TryAcquireBuffer(int)尝试从内存池中获取内存块
    这个内存块通常用于存储相机帧的图像数据并输入 EasyAR。
  • ExternalFrameSource.ReceivedFrameCountEasyAR 获取到的相机帧计数
    EasyAR 会用它来检查设备相机帧输入的健康情况。可以在调试中使用,如果这个数值停止增长,通常说明设备停止向 EasyAR 输入数据。

Unity 消息

在脚本中使用以下消息时,需要注意确保基类实现被调用:

后续步骤

相关主题