雅诗的小世界
命运的红线一旦断了,就再也不会再接上。
——犬夜叉
试玩 iOS11 ARKit
2017年6月7日 • 我的博客

Kagurazaka Yashi

Kagurazaka Yashi

欢迎来到我的个人网站!欢迎在评论区留个脚印,交个朋友。


这是一篇原创文章,转载请注明来自雅诗的小世界

 

又到了熬夜看 WWDC 的时候了,这次当然也不例外。 虽然这次感觉像是看了一场发布会233 现场演示了 AR 的功能,感觉还是挺震撼的呢。 于是我也和很多人一样,第一时间更新测试版系统和 Xcode ,一探究竟。 打开 Xcode 可以看到新的东西已经出现啦,那么就去学习一个好了。 名字就随便取一个好了,这里我先用 SceneKit 了。 先去 Main.storyboard 里面看看好了,里面只有一个进入就会显示的 View Controller,里面放着一个占满屏幕的 ARKit SceneKit View,这就是主角啦~ 查了一下,还有一个 ARKit SpriteKit View 。 那么,UI设计器里也没什么其他东西了,看看代码好了。 先瞧瞧 AppDelegate ,里面跟普通的 iOS 程序没什么两样,那么直接去看 ViewController 的代码吧。 它 import 了三个库: UIKit(基本UI), SceneKit(三维), ARKit(AR)。 在这个 UIViewController 类中,使用了一个叫 ARSCNViewDelegate 的代理,很明显,这里要用到这个 ARKit SceneKit View 的代理方法。 那么,直接先看看它实现了哪些代理方法好了。
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let node = SCNNode()
return node
}
这个默认是被注释掉的,这里只做了创建一个场景的基本构造块 SCNNode ,然后返回。如果节点需要,可以取消这里的注释重写它,不过这里就不用了。
再看看另外几个已经写好的代理实现:
  • func session(_ session: ARSession, didFailWithError error: Error)
    • 这个很明显是接收错误信息用的,如果运行出现了错误,这个代理方法会被调用, 你可以从 error 里拿出有用的信息来处理和通知用户。
  • func sessionWasInterrupted(_ session: ARSession)
    • 这个是将要中断的时候该做一些什么。
  • func sessionInterruptionEnded(_ session: ARSession)
    • 这个是已经结束时要执行的代码,重新做定位的时候可能会需要他。这时候可以做一些重置锚点之类的事情。
为了方便理解,先给他们加上输出好了。
funcsession(_ session: ARSession, didFailWithError error: Error) {
print("session")
}
funcsessionWasInterrupted(_ session: ARSession) {
print("sessionWasInterrupted")
}
funcsessionInterruptionEnded(_ session: ARSession) {
print("sessionInterruptionEnded")
}
接着回到这个 UIViewController 刚开始的地方:class ViewController 。
会发现,这个类里目前只有一个属性,是:
@IBOutlet var sceneView: ARSCNView!
这个就是那个在 Main.storyboard 里占了 ViewController 一满屏的那货,直接起名叫 sceneView 。
然后,就是这个 ViewController 的加载方法了:override func viewDidLoad() ,看一下里面的代码:
  • super.viewDidLoad()
    • 让父类帮你做一些初始化工作,这个基本算是固定用法。
  • sceneView.delegate = self
    • 在本类实现了 sceneView 的代理 ARSCNViewDelegate ,这里要告诉它一下。
  • let scene = SCNScene(named: "art.scnassets/ship.scn")!
    • 这里创建了一个新的 SCNScene ,直接用 named 调 3D 模型文件来初始化,还真是方便呢!
    • SceneKit,就是 SCN 开头的这些,是一个很方便3D引擎,可以去搜索了解一下。
    • ship.scn 是自带的一个小飞机模型,它已经在这个项目里了。如果你创建 iOS Project 的时候选择的是 Game, 也能看到这架小灰机,毕竟也是 SceneKit 。
  • sceneView.showsStatistics = true
    • 这个选项如果赋值为 true, 会显示一个统计信息,方便你知悉目前的性能状况,就像这样:
  • sceneView.scene = scene
    • 最后,指定 sceneView 里面的 scene 为这个我们刚刚创建的 scene。
接下来,我们要处理一下进入和离开这个 View 的操作,人走关灯是好习惯嘛。 先是进入操作 override func viewWillAppear(_ animated: Bool) 的代码:
  • super.viewWillAppear(animated)
    • 固定写法,View 的进入动画。
  • let configuration = ARWorldTrackingSessionConfiguration()
    • 创建了一个会话配置,但这个是什么鬼?看来要查查文档了。解释是 A configuration that tracks a device's orientation and position, and that detects real-world surfaces seen by the device camera.  一种跟踪设备定位和位置的配置,它可以检测设备摄像头看到的真实表面。喔,这很酷嘛。
  • 然后,以这个配置运行 session 就好:
    • sceneView.session.run(configuration)
最后是离开操作 override func viewWillDisappear(_ animated: Bool) 的代码:
  • super.viewWillDisappear(animated)
    • 固定写法,View 的离开动画。
  • sceneView.session.pause()
    • 这句话将暂停 session ,既然离开了当然要暂停掉,回来的时候 sceneView.session.run(configuration) 会让它继续运行。
代码就是这些了,感谢苹果,只需要这么多代码一个 AR 就这样实现了。 插上真姬,额……为什么是真姬?毕竟玩 AR 模拟器没法测试的嘛~~ Command+R ! 小·飞·机·出·现·啦! 小飞机会固定在这个位置,你可以围着这个位置转圈,或者举高手机,或者蹲下朝上,来从各个方向来观察它。不过有时这飞机会飞走233 还记得刚才写了几个输出吗?下面测试一下。
  • 按 home ,什么都没有发生。
  • 返回这个程序,输出了两条:
    • sessionWasInterrupted
    • sessionInterruptionEnded
  • 在运行起来给手机打电话,输出:
    • sessionWasInterrupted
  • 挂断电话回到应用,输出:
    • sessionInterruptionEnded
得益于 sceneView ,加个光照啊,换个模型啊,都简单了很多。

接下来,换个模型玩玩吧!

   于是,我获得了一个 kizunaai.scn 文件。 下面修改一下 viewDidLoad() 里的代码:
let scene = SCNScene(named: "art.scnassets/kizunaai.scn")! Command+R ! 有·什·么·出·现·啦! 她会固定在这个位置,你可以围着这个位置转圈,或者举高手机,或者蹲下朝上,来从各个方向来观察她。不过有时这她会飞走233 … ……… ………… ……………

评论区(为了避免垃圾信息,部分留言可能不会立即显示,其实已经发送成功,在我回复时会显示出来。)

发表评论

昵称
电子邮件
网址(选填)

更多栏目

联系我

 
Telegram Google+ Facebook Twitter
新浪微博 Github Steam 哔哩哔哩
 

分享本页

当前页面二维码

微信公众号
微信公众号

友谊广告

喵窩MC

云颜文字

樱花国代购

小猫设置


设置/关闭猫咪

🐱 Configure Neko
×

 Display

Size:


Refresh:


 Sensitivity

Speed:


Sensitivity:


OK
About
Exit

🐱 About Neko
×

Neko for HTML5 v1.0

Written by Kagurazaka Yashi.
Taking ingredients from Windows Version:
The original program (X-Windows)
was written by Masayuki Koba and
later modified by Tatsuya Kato.

This program is proud to be FREEWARE!

Github...
OK