ARKit资料

SceneKit(1): 解析 WWDC2017 ARKit D

2018-08-23  本文已影响325人  拾识物者

在WWDC2017上,苹果推出了ARKit,在介绍完基本概念和用法后,演示了一个很小的 demo,虽然比较简单,但是很有趣,只需要几分钟就可以写出来。但对 SceneKit 不熟悉的同学来说,可能还有几个迷惑的地方,我们正好可以通过这个小 demo,管中窥豹学习一些基本知识。

这个Demo在AR场景中显示了一个飞机模型,手指点击屏幕,会将当前看到的画面截屏,并固定在场景中,就像将拍摄的照片固定在真实世界中一样。

ARKit Demo

先来看一下核心代码:

guard let currentFrame = sceneView.session.currentFrame else {
    return
}

// Create an image plane using a snapshot of the view
let imagePlane = SCNPlane(width: sceneView.bounds.width / 6000, 
                          height: sceneView.bounds.height / 6000)
imagePlane.firstMaterial?.diffuse.contents = sceneView.snapshot()
imagePlane.firstMaterial?.lightingModel = .constant

// Create a plane node and add it to the scene
let planeNode = SCNNode(geometry: imagePlane)
sceneView.scene.rootNode.addChildNode(planeNode)

// Set transform of node to be 10cm in front of camera
var translation = matrix_identity_float4x4
translation.columns.3.z = -0.1
planeNode.simdTransform = matrix_multiply(currentFrame.camera.transform, translation)

我们来一句一句剖析这段代码:

let imagePlane = SCNPlane(width: sceneView.bounds.width / 6000, height: sceneView.bounds.height / 6000)
imagePlane.firstMaterial?.diffuse.contents = sceneView.snapshot()
imagePlane.firstMaterial?.lightingModel = .constant
let planeNode = SCNNode(geometry: imagePlane)
sceneView.scene.rootNode.addChildNode(planeNode)
var translation = matrix_identity_float4x4
translation.columns.3.z = -0.1
planeNode.simdTransform = matrix_multiply(currentFrame.camera.transform, translation)

以上代码解析完毕,这个 demo 虽然小,但是涉及到了很多 SceneKit 的概念和用法。比较难以理解的是最后的矩阵变换,可能需要复习一下数学知识。矩阵使用熟练以后可以实现很多有趣的功能,后面的文章中会包含一些相关的例子。

上一篇 下一篇

猜你喜欢

热点阅读