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 中?