前言
最近Apple刚好在WWDC21
上发布了Object Capture,基于这个契机,我们就想用苹果提供生成的模型加上最新的RealityKit
框架进行一次实景AR开发,这篇文章就简单介绍RealityKit
的基础概念。
介绍
RealityKit
框架专门为增强现实量身定制,能够提供逼真的图像渲染、相机特效、动画、物理特效等等。借助原生ARKit
整合、基于物理的超逼真渲染、变换和骨骼动画、空间音频和刚体物理,RealityKit
可以比以往更加快速轻松地进行增强现实开发。
基础概念
如下图ARView
的结构层次:
首先ARView
就是用于展示AR体验的视图,可以将它添加到父视图中,通过初始化cameraMode
的不同,可以确定是否需要使用相机生成真实的AR场景还是虚拟场景,这个比较简单。看下API:
1 | public init(frame frameRect: CGRect, cameraMode: ARView.CameraMode, automaticallyConfigureSession: Bool) |
其次是Scene
就是保存AR视图呈现的容器,我们不需要直接创建,可以通过ARView·
获取到scene
这个熟悉,后续我们的模型都是直接或者间接添加到这个scene
上。
然后就是Entity
了,这里有Anchor Entity
,Model Entity
,其实本质都是继承与Entity
,同时,如果我们想要自定义一些Entity
,我们可以通过继承Entity
,同时实现相应的协议,同时加载相应的Component
,就可以创建具有不同外观和行为的实体,如下图:
这边又有两个概念,一个是协议,一个是Component
,其实概括来讲就是协议让Entity
拥有了某项能力,而Component
则是用来真正装备该能力的组件修饰,所以,如果我想要一个Entity
拥有外观属性(大小、颜色),那我们我们就需要继承HasModel
这个协议,同时配置Component
这个属性赋予这个实体真正的外观属性,后面再深入介绍。
苹果默认提供了两个基础Entity
,一个是Anchor Entity
,一个是Model Entity
,现在我们就来具体介绍这两个Entity
。
Entity
一个基类Entity
默认实现了HasTransform
和HasSynchronization
协议,拥有Transform component
与Synchronization component
两个组件,分别用于空间转换(大小、位移,旋转)与联网时的同步操作,同时还实现了HasHierarchy
协议,允许所有的Entity
拥有层级关系(父实体,子实体)。
AnchorEntity
Anchor Entity
默认实现了HasAnchoring
协议,实现该协议之后就是允许该实体能够将该虚拟内容渲染到真实世界,我们一般用来把他作为基础实体,然后后续具体的实体添加到这个Anchor Entity
上,后续添加到ARView
上继续渲染,可以把他当成一个载体,本身并没有形状或者外观。
ModelEntity
另一个默认提供的实体是Model Entity
,实现了HasModel
, HasPhysics
两个协议。
HasModel
这个协议本身就继承于HasTransform
协议,他针对与HasTransform
协议,又增加了一个Model component
组件,允许设置该实体的外观大小包括纹理等信息。HasPhysics
这个协议是HasPhysicsBody
与HasPhysicsMotion
协议的总和。HasPhysicsBody
又继承于HasCollision
,HasCollision
又继承于HasTransform
。HasCollision
增加的组件特性就是碰撞体积与控制模式(是否需要记录细节碰撞信息);HasPhysicsBody
新增的组件特性是允许对该物体施加外力并进行运动。HasPhysicsMotion
新增的组件特性是基础运动模式,能够在创建后无需外力就保持一个持续的运动,同时判断是否允许外界改变行为;
自定义Entity
所以,基于上面的介绍,我们自定义Entity
也就很简单了,只要针对于我们的场景,选择不同的协议与添加对于的Component
就可以得到我们定制的实体,用于展示,非常Swift。
简单实现
那么我们就来简单实现一个非AR场景下的Box实体,并增加一个自旋动作。
首选我们就自定义一个实体,有以下需求:
- 直接添加到
Scene
上,需要有Anchor Entity
的锚点添加特性,所以继承HasAnchoring
协议 - 需要自定义一个形状box和颜色,所以继承
HasModel
协议 - 需要增加一个自旋匀速运动,所以继承
HasPhysics
协议
1 | class Box: Entity, HasAnchoring, HasModel, HasPhysics { |
这样,一个简单的自定义实体就已经定制完了。
然后创建我们的ARView
,添加到主视图,并通过ARView
获取的Scene
添加Box
实例,然后就能肯定一个沿着y轴恒定速度旋转的盒子了。
代码如下:
1 | class ViewController: UIViewController { |
效果图:
结语
一个简单的旋转模型就实现了,是不是很简单,可以自己尝试下。