上部分(juejin.im/post/5d1897…)咱们在Xcode显示了一个最简单的模型(cube),那么本部分主要实如今Xcode导入制做好的3D模型,使用ARKit在现实环境中显示出来。node
3D模型资源:git
https://pan.baidu.com/s/1Lrave2Km_DRims84yI8jmA 密码:4769
github
原项目工程:swift
https://pan.baidu.com/s/12hAAC_EuTBvqIqz7Iwonxw 密码:5tm0
bash
本部分的教程直接在这个项目基础上进行开发。
微信
SceneKit支持两种格式:SceneKit Scene (.scn)和Digital Asset Exchange (.dae)。app
打开Xcode导入刚刚下载好的项目并Build:ide
在ViewController类中插入如下方法:
post
func addPaperPlane(x: Float = 0, y: Float = 0, z: Float = -0.5) {
guard let paperPlaneScene = SCNScene(named: "paperPlane.scn"), let paperPlaneNode = paperPlaneScene.rootNode.childNode(withName: "paperPlane", recursively: true) else { return }
paperPlaneNode.position = SCNVector3(x, y, z)
sceneView.scene.rootNode.addChildNode(paperPlaneNode)
}复制代码
上面的代码中,咱们首先使用paperPlane.scn初始化SCNScene对象。测试
接下来,咱们初始化打开一个具备paperPlane节点名称的SCNNode对象。将递归参数设置为true。
初始化节点以后,咱们将paperPlaneNode的位置设置为x、y和z参数。默认位置是零向量。将z的默认值设置为-0.5,表示对象位于摄像机前面。
最后,paperPlaneNode添加到sceneView的根节点。
在viewDidLoad()方法中调用addPaperPlane(x:y:z:)方法:
override func viewDidLoad() {
super.viewDidLoad()
addPaperPlane()
}复制代码
接下来点击运行。你会看到一架白纸飞机,效果以下图:
运行测试会发现模型有些突兀,这是由于没有加入Light,接下来实如今场景中加入光源。
在ViewController类中,添加如下方法:
func configureLighting() {
sceneView.autoenablesDefaultLighting = true
sceneView.automaticallyUpdatesLighting = true
}复制代码
建立一个configureLighting()方法。在方法内部,咱们将sceneView的autoenablesDefaultLighting属性设置为true,SceneKit会自动向场景添加灯光。
接下来,将sceneView的automaticallyUpdatesLighting属性也设置为true,视图自动建立一个或多个SCNLight对象,将它们添加到场景中,并更新它们的属性。若是想直接控制SceneKit场景中的全部照明,则须要将该值设置为false。
在viewDidLoad()方法中调用configureLighting()方法:
override func viewDidLoad() {
super.viewDidLoad()
configureLighting()
addPaperPlane()
}复制代码
再次运行,会发现和第一次彻底不一样的效果:
对于包含多个nodes的3D模型(好比文件中的小车模型),咱们有不一样于单个node模型(好比上面的飞机)的处理方法。
打开ViewController.swift文件,在addPaperPlane(x:y:z:)方法下插入如下代码:
func addCar(x: Float = 0, y: Float = 0, z: Float = -0.5) {
guard let carScene = SCNScene(named: "car.dae") else { return }
let carNode = SCNNode()
let carSceneChildNodes = carScene.rootNode.childNodes
for childNode in carSceneChildNodes {
carNode.addChildNode(childNode)
}
carNode.position = SCNVector3(x, y, z)
carNode.scale = SCNVector3(0.5, 0.5, 0.5)
sceneView.scene.rootNode.addChildNode(carNode)
}
复制代码
如今注释掉addPaperPlane()方法,并在viewDidLoad()方法中调用addCar()方法:
override func viewDidLoad() {
super.viewDidLoad()
configureLighting()
//addPaperPlane()
addCar()
}复制代码
接下来点击运行,效果以下图:
完整项目连接:https://github.com/appcoda/ARKit3DDemo
参考资料:https://www.appcoda.com/arkit-3d-object/
------AR Portal(AR开发者社区)整理
关注微信公众号(AR开发者交流社区,提供AR开发干货,推进AR内容发展):AR开发者社区