本文主要讲解 SCNScene 和 SCNView 相关内容。
0. 写在前面
本文结构如下:
本文结构图1. SCNScene
开始之前,需要做一个名词的中英文对照。
- scene :场景
- node:节点
- view:视图
SCNScene对象表示三维场景及其内容。节点组成的层级结构(树形结构)构成整个场景的骨架,相机、灯光、几何体等“内容”附着在节点上,这些节点以及附着在节点上属性,构成了一个可见的3D场景。
场景通过SCNView
、SCNLayer
(仅限macOS)或 SCNRenderer
来展示,这几个展示类都遵循SCNSceneRenderer
协议,该协议定义这些类共享的属性和方法。
SCNScene类还提供读写场景文件的界面。
1.1 从场景文件中读取场景
一般,可以使用一些软件,比如3Dsmax、maya,来制作3D场景,然后将这些场景文件导入到项目中来。
SceneKit提供了如下API来加载场景文件:
SceneKit 还提供了一个API,从Model I/O资源中加载场景:
Model I/O此处不做展开讲述,你知道有这种方法即可。
.scnassets文件夹。
回忆我们之前创建的空AR项目,里面都会有个art.scnassets。
image.png
文件夹里存放场景资源(示例中的ship.scn)和纹理资源(示例中的texture.png),Xcode会优化这些资源,以便在每个设备上获得最佳性能,比如说应用瘦身和按需加载资源。
这部分内容,我在《SceneKit | 加载 3D模型(obj/scn/dae)到你的AR项目中》中,有demo演示!
1.2 用代码的方式创建场景
SceneKit 提供了创建场景的类方法:
调用这个方法可以创建一个空场景,这个空场景只包含一个“不包含任何内容的 root 节点”,可以通过在root节点上添加子节点的方式,来创建一个场景。
1.3 保存场景到文件中
这个功能是很重要的,比如,我们团队另外一位同事最近在做的一件事儿就是,将 ARKit 输出 含有深度数据的ARFaceGeometry
人脸从iPhone X中导出来,然后利用3D打印设备打印人脸。我下面介绍的方法就是导出人脸的其中一种方式。
开始本小节之前,科普一下两种文件格式:
- .scn 文件,是SceneKit的 原生格式,这种格式的场景文件支持所有的SceneKit特性,诸如物理效果、约束以及粒子系统,并且,按照这种格式来导入场景文件,速度是最快的;
- .dae 文件,dae是Digital Asset Exchange 的缩写,这种格式的场景文件不支持SceneKit特性,诸如物理效果、约束以及粒子系统
SceneKit 提供了 保存场景方法:
改方法可以将SceneKit的场景写入到文件中,文件的格式由操作系统和你指定的文件后缀来决定:
- 在 iOS 10.0, tvOS 10.0, watchOS 3.0, OS X v10.11,以及更高的版本里,指定
.scn
为文件后缀,可以按照SceneKit原生格式保存文件; - 在macOS上,可以指定
.dae
为文件后缀,将场景保存为dae文件; - 在一些不支持上面write方法的低版本系统里,可以通过
NSKeyedArchiver
将场景序列化为scn文件。
1.4 更多API
上面讲述了一些高频使用的API,SCNScene更多的API可以自行前往开发者文档查询。
2. SCNView
SCNView继承自UIView,用来展示SceneKit 3D内容。
2.1 实例化 SCNView && 指定显示场景
系统提供了如下init方法:
通过设置 scene 属性,在view上显示指定的场景。
2.2 在视图的场景中播放动作和动画
SCNView 提供了三个方法,来管理当前场景中的动画:
-
func pause(Any?)
, 暂停播放视图的场景; -
func play(Any?)
,开始播放视图的场景; -
func stop(Any?)
,停止播放视图的场景。
2.3 捕获场景快照
SCNView 提供了一个快照当前场景的方法,可以将当前的场景渲染到新的图像对象上:
下一篇《iOS 11 SceneKit开发教程03 | 使用SCNNode && SCNReferenceNode定义场景结构》,会介绍SCNNode和SCNReferenceNode相关内容。
网友评论