ARKit之路-RealityKit概述之二

版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。
  RealityKit是一个全新的AR应用开发框架,有着独立的体系结构。

RealityKit体系结构

  RealityKit是一个高级的程序框架,提供了非常丰富的功能,但使用其进行AR应用开发却有着非常清晰的层次结构体系,如下图所示。
ARKit之路-RealityKit概述之二

  从上图可以看到,RealityKit中包含四类实体:ARView、Scene、Anchor、Entity,由这四类实体可以构建出所有AR功能。利用RealityKit进行AR应用开发,所有的虚拟元素在场景中都以实体的形式存在,虚拟元素的功能则由该实体上挂载的组件共同决定。RealityKit中的实体可以有一个父实体和若干个子实体,众多的实体相互关联组成整个场景的层次结构。RealityKit这种层次结构设计能非常方便的进行对象组合,同时也非常有利于进行空间位置关系解算。

  ARView
  ARView在RealityKit中处于核心地位,是进入AR虚拟世界的入口,也是将渲染的场景呈现给用户的窗口,每一个ARView都包含一个Scene类实例。在开发中,我们通常只会设置一个ARView,RealityKit会自动创建并添加一个Scene实例到这个ARView上,通过Scene就可以添加各种各样的实体和Anchor了。

ARView除了作为AR应用层次结构的根节点,ARView还负责设置渲染特性、环境检测选项、摄像机渲染模式,ARView还处理各类输入交互,利用RealityKit的层次结构,我们也可以使用ARView来查询特定实体对象。

  Scene
  Scene中文直译为场景,顾名思义,Scene是放置所有实体对象的容器,所有需要渲染或者不需要渲染的实体对象最终都需要关联到Scene上。在RealityKit中,我们不需要手动去创建Scene类的实例,在创建ARView时会自动创建,因此,我们可以通过ARView的属性访问到与其关联的Scene实例。

  在Scene中添加虚拟元素,首先需要在Scene的anchors集合中添加一个或者多个AnchorEntity实例,AnchorEntity用于在现实空间与虚拟元素之间建立关联关系,将虚拟元素绑定到现实空间中的特定对象上(如平面、2D图像、3D物体、人脸等);在添加AnchorEntity实例后再将实体对象添加到AnchorEntiy上形成层级关联关系。

  AnchorEntity
  只有AnchorEntity实例能添加到Scene的anchors集合中,AnchorEntity也是所有其他实体的根节点,通过AnchorEntity,RealityKit就能将所有虚拟元素正确的放置到现实世界中,形成正确的虚实关联关系。

从技术上说,AnchorEntity继承自Entity类,AnchorEntity因拥有AnchoringComponent组件而遵循HasAnchoring协议,因此AnchorEntity实例能添加进Scene的anchors集合的原因是因为遵循了HasAnchoring协议。在实际开发中,我们也可以自定义实体类,只要其遵循HasAnchoring协议就可以直接添加到Scene的anchors集合中,这并未破坏上图的层次结构,只是将Entity与Anchor进行了进一步的整合。

  在一个Scene中,可以添加一个或多个AnchorEntity对象,每一个AnchorEntity都可以有其独立的层次结构。如在桌面上放置一只水杯,可以为这只水杯设置一个AnchorEntity,然后在地板上放置一个足球,可以为这个足球设置另一个AnchorEntity。

  Entity
  Entity是Scene的重要组成部分,也是AR应用最基本的组成元素。可以把Entity想象成一个容器,这个容器原本没有任何外观和功能,通过挂载不同的组件而形成不同的外观表现和不同的行为特性。事实上,在RealityKit中,所有的Entity都默认挂载了Transform Component 和Synchronization Component两个组件,其中Transform Component用于描述实体的空间位置信息,而Synchronization Component则用于在不同的使用者设备之间同步数据。

  Entity包含components集合(Entity遵循Component协议)用于挂载各类组件,正是这些组件决定了Entity的外观表现和行为特性,如Transform Component组件包含了虚拟元素在现实空间中的位置、旋转、缩放等信息,Model Component组件使用材质、纹理渲染虚拟元素的外观,Collision Component组件则定义了虚拟元素与其他物体发生碰撞的细节。

  Entity包含的components集合可以挂载很多不同种类的组件,但每一类特定的组件只能挂载一次。在下图中,AnchorEntity是挂载了Anchoring Component组件的Entity实例,而ModelEntity则是同时挂载了Model Component、Collision Component、Physics Body Component、Physics Motion Component组件的Entity实例。
ARKit之路-RealityKit概述之二

  Entity的层次结构可以保存到文件中,因此,可以从程序包(App Bundle)或者文件中加载Entity结构,这极大提高了模块的复用性,也是RealityKit与Reality Composer得以紧密交互的基础。当然,Entity层次结构可以在运行时通过程序的方式构建。

  利用Entity和Component的这种组合式开发模式,开发者可以快速构建出符合要求的有着独特外观表现和行为特性的Entity实例,同时,为方便开发人员使用,RealityKit也预定义了下图所示的八类Entity,可以直接使用。
ARKit之路-RealityKit概述之二