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

说明

ARKit系列文章目录swift

本文是Ray Wenderlich上《ARKit by Tutorials》的读书笔记,主要讲内容概要和读后感  session

该书推出了三个免费章节,主讲如何制做一个时空门app:第7,8,9章,我对其进行了完整翻译,而本文是对如下三章内容的总结和感想:app

第一篇:准备开始

主要讲了初始的准备工做,ARSession的启动,平面检测,debug选项 ide

session被打断后的处理,平面更新处理等

第二篇:添加物体

主要讲了命中测试Hit testing来给屏幕中央处添加锚点post

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物体了spa

第三篇:材质和光照

主要讲了大量材质纹理的实际使用,包括wrapping mode等wrapT,wrapS翻译

还有灯光的使用debug

本章节中最有趣的部分就是:如何让时空门从外面没法看到(从外面只能看到门框),而进入门内,全部东西都能看到.就是这种效果: 3d

作法很是神奇:在墙壁的外侧再包一层几乎透明的几何体(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就火了起来,但不少人只公开了视频效果,并无公开代码.相信大多数人和我同样,虽然总体上感受不难,但始终不明白这种外面看不到墙壁的效果是如何实现的,这本书终于帮咱们解开了疑惑.

第二部分读书笔记结束!

相关文章
相关标签/搜索