介绍
SceneKit是高级3D图形API,自10.8版(Mountain Lion)开始在OS X中可用,并且在iOS 8发行版中随iOS引入。在本教程中,我向您展示框架的主要改进和新功能。通过iOS 9和OS X 10.11 El Capitan的发布获得了收益。
先决条件
要跟我一起学习,您需要在计算机上安装Xcode 7.2或更高版本。 此版本的Xcode包括Swift 2.1和最新的iOS 9和OS X El Capitan SDK。 我还要假设您已经熟悉SceneKit框架。 如果您不熟悉SceneKit,那么我建议您先阅读我的入门教程 。
1. Xcode场景编辑器
iOS 9和OS X El Capitan中SceneKit最重要的新增功能是能够使用Xcode内置的可视编辑器创建和编辑场景。
通过选择iOS>应用程序> Single View Application模板创建一个新的Xcode项目。 创建一个新文件,然后选择“ iOS”>“资源”>“ SceneKit场景文件”模板。 将新文件命名为MainScene 。
![SceneKit场景文件类型](https://i-blog.csdnimg.cn/blog_migrate/85f0037431c06fad4436f651ffaf33ab.png)
当您选择新文件时,Xcode会显示一个类似于以下内容的屏幕:
![Xcode场景编辑器](https://cms-assets.tutsplus.com/uploads/users/855/posts/25896/image/Screen%20Shot%202016-02-08%20at%205.02.46%20PM.png)
在将任何对象添加到场景之前,您应该首先熟悉如何浏览新的场景编辑器。 这是您可以利用的所有基本运动机制:
- 单击并拖动将围绕您当前正在查看的点旋转视图。
- 滚动将场景平移到整个视图中。
- 按Alt或Option并垂直滚动,可以放大和缩小场景。 请注意,这也可以通过捏在触控板上来实现。
导航完场景后,请单击场景编辑器左下方的“ 视点”菜单,然后将其从“ 免费相机”更改为“ 相机” 。
![视点菜单](https://i-blog.csdnimg.cn/blog_migrate/aae631dca46fb86666a9af969925e56e.png)
这会将您的视点重置为默认情况下添加到场景中的摄像机。
打开右侧的对象库 。 它包括可以添加到场景中的各种对象。 目前,我们仅创建一个基本场景。 在对象库中搜索Sphere并将一个实例拖到场景中。 选择添加的球体时,一组控件将出现在其中心。
![将球体添加到场景](https://i-blog.csdnimg.cn/blog_migrate/6fd61fcafadc804ef62f2a5718bf6a8e.png)
这些控件使您可以在场景中四处移动对象。 您也可以单击并拖动箭头之间的任何彩色曲线以旋转对象。
从对象库中 ,向场景中添加一个定向光 。 使用旋转控件,单击并拖动绿色曲线以旋转灯光,直到球体照亮为止,如以下屏幕截图所示。
![定向光点亮的球体](https://i-blog.csdnimg.cn/blog_migrate/56a0adc8380901f4ccdb488ff68fa5cc.png)
除了在场景中移动和旋转对象外,还可以配置一系列属性以消除项目中场景设置代码的需要。 选择之前添加的球体,打开右侧的“ 属性”检查器 ,然后将球体的“ 半径”更改为0.5 。
![半径属性](https://i-blog.csdnimg.cn/blog_migrate/23102e108d51b11e64b9af26ce71cfe6.png)
如果通过Attributes Inspector查看,您还将看到您还可以编辑球体几何的其他各种属性。
现在我们已经建立了基本的场景,是时候将其加载到实际运行的应用程序中了。 打开ViewController.swift并将文件内容替换为以下代码:
import UIKit
import SceneKit
import SpriteKit
class ViewController: UIViewController {
var sceneView: SCNView?
var mainScene = SCNScene(named: "MainScene.scn")
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.sceneView = SCNView(frame: self.view.frame)
self.sceneView?.scene = mainScene
self.view.addSubview(self.sceneView!)
let button = UIButton(type: .System)
button.tintColor = UIColor.blueColor()
button.setTitle("Transition", forState: .Normal)
button.sizeToFit()
button.addTarget(self, action: "didPressTransition", forControlEvents: .TouchUpInside)
button.center.x = self.view.center.x
button.frame.origin.y = self.view.frame.height - button.frame.height - 12
self.sceneView?.addSubview(button)
}
func didPressTransition() {
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
首先要注意的是mainScene
属性和初始化程序init(named:)
,我们将其实例SCNScene
实例。 使用此初始化程序,您只需传递您刚才创建的场景文件的名称。
我们还在视图控制器的viewDidLoad()
方法中创建并设置一个按钮。 在本教程的稍后部分,我们将使用该按钮。
运行应用程序时,应该看到场景出现在屏幕上,就像在Xcode的场景编辑器中一样。
![带场景功能的App](https://cms-assets.tutsplus.com/uploads/users/855/posts/25896/image/Simulator%20Screen%20Shot%208%20Feb%202016,%205.50.43%20PM.png)
2.自发光材料
现在,SceneKit材质可以指定照明组件来照明对象,而无需任何额外的灯光。 这种自发光在物体没有被其他光线直接击中的地方最为明显,例如,在当前场景中我们的球体为黑色的地方。
打开MainScene.scn ,选择之前添加的球,然后打开右侧的“ 材质”检查器 。 向下滚动并将照明属性设置为红色。
![照明特性](https://cms-assets.tutsplus.com/uploads/users/855/posts/25896/image/Screen%20Shot%202016-02-08%20at%206.04.07%20PM.png)
您将看到您的球体现在具有红色,即使没有光线照射到它。
![红色的球体](https://cms-assets.tutsplus.com/uploads/users/855/posts/25896/image/Screen%20Shot%202016-02-08%20at%206.05.43%20PM.png)
通过添加以下代码,您可以在代码中实现相同的结果:
let material = SCNMaterial()
material.selfIllumination.contents = UIColor.redColor()
sphereNode.material = material
3.场景转换
通过使用SpriteKit的SKTransition
类,您现在还可以在SCNScene
对象之间添加动画过渡。 打开ViewController.swift并将ViewController
类的didPressTransition()
方法的实现替换为以下内容:
func didPressTransition() {
let transition = SKTransition.pushWithDirection(.Right, duration: 1.0)
self.sceneView?.presentScene(SCNScene(), withTransition: transition, incomingPointOfView: nil, completionHandler: nil)
}
您可以将任何SKTransition
对象与presentScene(_:withTransition:incomingPointOfView:completionHandler:)
方法一起使用。 浏览SKTransition
类的文档 ,以检查所有可能的过渡。
再次构建并运行您的应用程序。 这次,当您按下“ 过渡”按钮时,球体将向右移动,因为新的空白场景将在屏幕上进行动画处理。
4.音频节点
SceneKit的另一个主要新增功能是能够逐节点播放音频。 除此之外,还可以通过在这些音频节点周围移动来创建3D音频效果,以便用户可以体验到围绕它们的声音。
要创建此3D音频效果,每个符合SCNSceneRenderer
协议的对象(即每个SCNView
)都具有一个audioListener
属性,该属性指定应从中听到声音的节点。 默认情况下,此属性始终是场景中的摄像机。
可以使用以下代码创建音频节点:
let audioNode = SCNNode()
let audioSource = SCNAudioSource(fileNamed: "AnAudioFile.mp3")!
let audioPlayer = SCNAudioPlayer(source: audioSource)
audioNode.addAudioPlayer(audioPlayer)
let play = SCNAction.playAudioSource(audioSource, waitForCompletion: true)
audioNode.runAction(play)
请记住,音频不会自动播放。 SCNAction
例所示,这需要通过SCNAction
实例完成。 浏览《 多媒体编程指南》以获取兼容音频文件类型的列表。
如果您不想利用这种位置音频,例如音乐,则可以轻松创建环境音频节点。 这是通过将音频源的positional
属性设置为false
。 您还可以通过将源的loops
属性设置为true
来连续循环播放声音。
5.金属的采用
除了OpenGL ES,SceneKit现在还支持Apple的Metal图形API来渲染其图形,从而在较新的设备上显着提高了性能。 这也意味着,如果您熟悉Metal着色语言,现在就可以利用自定义SCNProgram
和SCNTechnique
对象来利用Metal的新功能。
默认情况下,SceneKit在较新的设备上使用Metal,而在较旧的设备上使用OpenGL ES。 如果出于某种原因而只想使用这些渲染API之一,则可以更改任何SCNView
对象上的renderingAPI
属性。
结论
iOS 9和OS X El Capitan中SceneKit的新增功能使该框架更加强大,更适合休闲3D游戏。 除了添加到SceneKit框架中的新功能之外,新的Xcode场景编辑器还使您可以轻松创建场景,而无需以编程方式设置所有内容。
与往常一样,请确保在下面的评论中留下您的评论和反馈。
翻译自: https://code.tutsplus.com/tutorials/ios-9-additions-to-scenekit--cms-25896