15-《ARKit by Tutorials》读书笔记2:时空门

1,182 阅读3分钟

说明

ARKit系列文章目录

本文是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
}

代码解释:

  1. 创建一个outerSurface场景立方体几何体对象,尺寸和地板与天花板相同.
  2. 添加可见内容到立方体对象的漫反射属性,使其渲染出来.设置transparency(透明度) 为非常低的数值,这样这个物体就从视图中隐藏起来.
  3. outerSurface几何体创建一个SCNNode对象.设置节点的renderingOrder(渲染顺序) 为10.节点的渲染顺序值越大就渲染得越晚.为了让地板和天花板从时空门外面不可见,你将需要使内部的天花板和地板节点的渲染顺序远大于10.

由于时空门app的制作过程已经由官方作为免费章节发布,我也全部翻译了出来.本文只列出了重点内容,如有需要请精读原文或译文.

自从ARKit发布后,网上类似时空门这类Demo就火了起来,但很多人只公开了视频效果,并没有公开代码.相信大多数人和我一样,虽然整体上感觉不难,但始终不明白这种外面看不到墙壁的效果是如何实现的,这本书终于帮我们解开了疑惑.

第二部分读书笔记结束!