iOS 9:SceneKit的新增功能

介绍

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场景文件类型

当您选择新文件时,Xcode会显示一个类似于以下内容的屏幕:

Xcode场景编辑器

在将任何对象添加到场景之前,您应该首先熟悉如何浏览新的场景编辑器。 这是您可以利用的所有基本运动机制:

  • 单击并拖动将围绕您当前正在查看的点旋转视图。
  • 滚动将场景平移到整个视图中。
  • AltOption并垂直滚动,可以放大和缩小场景。 请注意,这也可以通过捏在触控板上来实现。

导航完场景后,请单击场景编辑器左下方的“ 视点”菜单,然后将其从“ 免费相机”更改为“ 相机”

视点菜单

这会将您的视点重置为默认情况下添加到场景中的摄像机。

打开右侧的对象库 。 它包括可以添加到场景中的各种对象。 目前,我们仅创建一个基本场景。 在对象库中搜索Sphere并将一个实例拖到场景中。 选择添加的球体时,一组控件将出现在其中心。

将球体添加到场景

这些控件使您可以在场景中四处移动对象。 您也可以单击并拖动箭头之间的任何彩色曲线以旋转对象。

对象库中 ,向场景中添加一个定向光 。 使用旋转控件,单击并拖动绿色曲线以旋转灯光,直到球体照亮为止,如以下屏幕截图所示。

定向光点亮的球体

除了在场景中移动和旋转对象外,还可以配置一系列属性以消除项目中场景设置代码的需要。 选择之前添加的球体,打开右侧的“ 属性”检查器 ,然后将球体的“ 半径”更改为0.5

半径属性

如果通过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

2.自发光材料

现在,SceneKit材质可以指定照明组件来照明对象,而无需任何额外的灯光。 这种自发光在物体没有被其他光线直接击中的地方最为明显,例如,在当前场景中我们的球体为黑色的地方。

打开MainScene.scn ,选择之前添加的球,然后打开右侧的“ 材质”检查器 。 向下滚动并将照明属性设置为红色。

照明特性

您将看到您的球体现在具有红色,即使没有光线照射到它。

红色的球体

通过添加以下代码,您可以在代码中实现相同的结果:

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着色语言,现在就可以利用自定义SCNProgramSCNTechnique对象来利用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值