SceneKit开发教程02 SCNScene和SCNView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SceneKit开发教程02 SCNScene和SCNView相关的知识,希望对你有一定的参考价值。

参考技术A

本文结构如下:

开始之前,需要做一个名词的中英文对照。

SCNScene对象表示三维场景及其内容 。节点组成的层级结构(树形结构)构成整个场景的骨架,相机、灯光、几何体等“内容”附着在节点上,这些节点以及附着在节点上属性,构成了一个可见的3D场景。

场景通过 SCNView 、 SCNLayer (仅限macOS)或 SCNRenderer 来展示,这几个展示类都遵循 SCNSceneRenderer 协议,该协议定义这些类共享的属性和方法。

SCNScene类还提供读写场景文件的界面。

一般,可以使用一些软件,比如3Dsmax、maya,来制作3D场景,然后将这些场景文件导入到项目中来。

SceneKit提供了如下API来加载场景文件:

SceneKit 还提供了一个API,从Model I/O资源中加载场景:

Model I/O此处不做展开讲述,你知道有这种方法即可。

回忆我们之前创建的空AR项目,里面都会有个art.scnassets。

文件夹里存放场景资源(示例中的ship.scn)和纹理资源(示例中的texture.png),Xcode会优化这些资源,以便在每个设备上获得最佳性能,比如说应用瘦身和按需加载资源。

这部分内容,我在《 SceneKit | 加载 3D模型(obj/scn/dae)到你的AR项目中 》中,有demo演示!

SceneKit 提供了创建场景的类方法:

调用这个方法可以创建一个空场景,这个空场景只包含一个“不包含任何内容的 root 节点”,可以通过在root节点上添加子节点的方式,来创建一个场景。

这个功能是很重要的,比如,我们团队另外一位同事最近在做的一件事儿就是,将 ARKit 输出 含有深度数据的 ARFaceGeometry 人脸从iPhone X中导出来,然后利用3D打印设备打印人脸。我下面介绍的方法就是导出人脸的其中一种方式。

SceneKit 提供了 保存场景方法:

改方法可以将SceneKit的场景写入到文件中,文件的格式由 操作系统 你指定的文件后缀 来决定:

上面讲述了一些高频使用的API,SCNScene更多的API可以自行前往 开发者文档 查询。

SCNView继承自UIView,用来展示SceneKit 3D内容。

系统提供了如下init方法:

通过设置 scene 属性,在view上显示指定的场景。

SCNView 提供了三个方法,来管理当前场景中的动画:

SCNView 提供了一个快照当前场景的方法,可以将当前的场景渲染到新的图像对象上:

下一篇 《ios 11 SceneKit开发教程03 | 使用SCNNode && SCNReferenceNode定义场景结构》 ,会介绍SCNNode和SCNReferenceNode相关内容。

SceneKit中的SKScene

我正在尝试将一个动画SKScene添加到ARKit中的SCNScene。在查看WWDC 2017 session 609这似乎是可能的。在演示文稿中,代码看起来像这样......

//Get SpriteKit scene
let spriteKitScene = SKScene(fileNamed: "SpriteKitScene")

//Create plane geometry
let plane = SCNPlane(width: 10.0, height: 10.0)

//Set SpriteKit scene on the plane's material
plane.firstMaterial?.diffuse.contents = spriteKitScene

//If material double-sided, SpriteKit scene will show up on both sides of the plane
plane.firstMaterial?.isDoubleSided = true

//Create a SceneKit node for the plane
let sceneKitNode = SCNNode(geometry: plane)

//Add the Scenekit node to the SceneKit scene
scene.rootNode.addChildNode(sceneKitNode)

我可以做的事情:

  • 加载SKScene
  • 在关联的.swift文件中的sceneDidLoad()中添加精灵

我不能做的事情:

  • 使用SKScene的.swift文件中的任何传统方法,如didMove(to)或update()。
  • 在sceneDidLoad()中向场景中的节点添加动作

不确定我错过了什么。本季节的主持人展示了动画和互动的SK内容。

答案

想出这个。

didMove没有被调用,因为它在添加到diffuse.contents时不在响应者链中。

更新未被调用,因为SKScene在以这种方式添加时暂停。

以上是关于SceneKit开发教程02 SCNScene和SCNView的主要内容,如果未能解决你的问题,请参考以下文章

如何将 .dae 文件加载到 iOS SceneKit 中的 SCNNode 中?

如何在 iOS SceneKit 中使用具有不同场景图形的 DAE 文件

不可预测的 SceneKit 行为?

SceneKit 错误加载蒙皮角色

SceneKit中的SKScene

SceneKit AVPlayer 仅播放音频