说明
本文是Ray Wenderlich上《ARKit by Tutorials》的读书笔记,主要讲内容概要和读后感
该书推出了三个免费章节,主讲如何制作一个时空门app:第7,8,9章,我对其进行了完整翻译,而本文是对以下三章内容的总结和感想:
第一篇:准备开始
主要讲了初始的准备工作,ARSession的启动,平面检测,debug选项
session被打断后的处理,平面更新处理等第二篇:添加物体
主要讲了命中测试Hit testing来给屏幕中央处添加锚点
var viewCenter: CGPoint {
let viewBounds = view.bounds
return CGPoint(x: viewBounds.width / 2.0, y: viewBounds.height / 2.0)
}
// 1
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// 2
if let hit = sceneView?.hitTest(viewCenter, types: [.existingPlaneUsingExtent]).first {
// 3
sceneView?.session.add(anchor: ARAnchor.init(transform: hit.worldTransform))
}
}
利用命中测试,可以知道屏幕中心是否对准了一个平面
这样当对准平面时就可以点击屏幕添加3D物体了
第三篇:材质和光照
主要讲了大量材质纹理的实际使用,包括wrapping mode等wrapT,wrapS
还有灯光的使用
本章节中最有趣的部分就是:如何让时空门从外面无法看到(从外面只能看到门框),而进入门内,所有东西都能看到.就是这种效果:
做法非常神奇:在墙壁的外侧再包一层几乎透明的几何体(SCNBox的transparency = 0.000001),并控制外层的渲染顺序(renderingOrder),让它比内部的物体更早渲染出来
func makeOuterSurfaceNode(width: CGFloat,
height: CGFloat,
length: CGFloat) -> SCNNode {
// 1
let outerSurface = SCNBox(width: width,
height: height,
length: length,
chamferRadius: 0)
// 2
outerSurface.firstMaterial?.diffuse.contents = UIColor.white
outerSurface.firstMaterial?.transparency = 0.000001
// 3
let outerSurfaceNode = SCNNode(geometry: outerSurface)
outerSurfaceNode.renderingOrder = 10
return outerSurfaceNode
}
代码解释:
- 创建一个outerSurface场景立方体几何体对象,尺寸和地板与天花板相同.
- 添加可见内容到立方体对象的漫反射属性,使其渲染出来.设置transparency(透明度) 为非常低的数值,这样这个物体就从视图中隐藏起来.
- 从outerSurface几何体创建一个SCNNode对象.设置节点的renderingOrder(渲染顺序) 为10.节点的渲染顺序值越大就渲染得越晚.为了让地板和天花板从时空门外面不可见,你将需要使内部的天花板和地板节点的渲染顺序远大于10.
由于时空门app的制作过程已经由官方作为免费章节发布,我也全部翻译了出来.本文只列出了重点内容,如有需要请精读原文或译文.
自从ARKit发布后,网上类似时空门这类Demo就火了起来,但很多人只公开了视频效果,并没有公开代码.相信大多数人和我一样,虽然整体上感觉不难,但始终不明白这种外面看不到墙壁的效果是如何实现的,这本书终于帮我们解开了疑惑.
第二部分读书笔记结束!