Chapter 10: Detecting Placeholders

大綱

接下來,我們準備開始新的app。這個app是AR的互動式廣告看板,可以利用這個看板放些廣告跟優惠訊息。

這章的目標是先做到偵測到長方形,然後可以抓到長方形的四個角落, 並產生一個平面。

摘要

Plane detection vs. object detection

ARKit中的Plane detection是用來幫助使用者可以置放3D物件到某個平面上,隨著裝置的移動,會即時更新平面的狀態。然而,在這個例子是要偵測一個長方形平面,這屬於object detection的一部分,是由Vision Framework提供。

Vision Framework

  • 利用Vision來偵測真實世界中長方形平面,然後將偵測到真實平面的資訊送到ARKit中,ARKit再利用這些資訊通知SceneKit繪製出所需要的虛擬平面在真實世界中。

Detecting a rectangle

  • 每次點擊螢幕時,會對Vision發送一個VNDetectRectanglesRequest對當前的frame進行長方形平面偵測,若偵測到平面,則取到平面相關資訊,再利用ARKit的hitTest將Vision取得平面資訊轉換成虛擬世界的資訊。

    • currentFrame.hitTest(_:types:)

      • featurePoint

      • estimatedHorizontalPlane

      • existingPlane

      • existingPlaneUsingExtent

    • 如果是要偵測任何平面的長方形形狀,那就設定featurePoint就好。

Creating the billboard

Displaying placemarks

顯示長方形平面的四個角落,可以幫助我們在測試的時候,觀察是否有正確偵測到長方形平面。

Adding SceneKit nodess

到目前為止,我們利用Vision取得的資訊,轉化成ARKit的anchor並加到session之中,下一步就是把anchor的訊息傳送到SceneKit的node中。

Handling interruptions

目前看起來都還滿不錯,但如果把app退到背景然後旋轉手機(直立變橫放),在把app開啟,會發現剛剛偵測到placemark都位置錯亂了。主要原因就是退到背景後,session就沒辦法收到orientation的資訊,也就沒辦法更新位置。此時,最佳的作法就是在ARSCNViewDelegate: sessionWasInterrupted中做removeBillboard(),清除所有plane,在session恢復時再重新執行平面的請求。

Last updated