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就火了起來,但不少人只公開了視頻效果,並無公開代碼.相信大多數人和我同樣,雖然總體上感受不難,但始終不明白這種外面看不到牆壁的效果是如何實現的,這本書終於幫咱們解開了疑惑.

第二部分讀書筆記結束!

相關文章
相關標籤/搜索