2017-08-31 111 views
0

我正在使用ARKit-SceneKit處理應用程序。在我的應用程序中,我已經啓用了表面檢測(我跟着apple提供的放置對象樣本)。如何查找檢測到的表面是否不再可用?也就是說,最初只有當用戶在ARSession中檢測到表面時,我才允許他放置3D對象。如何查找在iOS 11中使用Scenekit是否無法使用ARKit檢測到的曲面?

但是,如果用戶快速移動或聚焦某處,檢測到的表面區域就會丟失。在這種情況下,如果用戶試圖放置另一個物體,我不應該允許他放置它,直到他再次掃描地板並修正表面。

是否有任何代表可以讓我們知道檢測到的表面不再可用?

回答

2

有代表你可以使用的功能。代表是ARSCNViewDelegate

它具有的功能是renderer(_:didRemove:for:),當ARAnchor已被刪除時觸發。當表面被移除時,您可以使用此功能執行某些操作。

ARSCNViewDelegate Link

+0

你的意思是說,如果沒有表面檢測,這個方法會被調用嗎?我試着把這個方法登錄。我試過的是我集中在地板上,表面檢測發生了,然後我把焦點集中在其他地方,這不是水平表面,而且這種方法沒有被調用 – yaali

+0

如果你發現任何表面或平面被從場景中移除,這種方法應該會丟失本身。如果發生「丟失」,並且電話在搖晃後失去了飛機/地面本身的位置,它仍然可以在AR世界的場景中使用,但手機失去了跟蹤並認爲地面是在別處。 –

+0

所以這個方法可能會在表面跟蹤由於晃動而丟失時被調用。我對嗎? – yaali

1

有兩種方式「失去」的表面,所以有一個以上的方式來處理這樣的問題。


正如其他答案指出,有一個ARSCNViewDelegate方法時錨從AR會話中刪除該ARKit電話。但是,在運行會話期間,ARKit不會刪除飛機錨點 - 一旦檢測到飛機,它會假定飛機始終在那裏。所以這方法被調用,僅當:

  1. 您可以通過它傳遞直接刪除飛機錨session.remove(anchor:),或
  2. 您通過與.removeExistingAnchors選項再次運行重置會話。

我不知道前者是一個好主意,但後者是重要的處理,所以你可能希望你的委託來應付自如。


也可以通過具有它傳遞出的視圖「丟失」的表面 - 例如,ARKit檢測表,然後用戶接通周圍所以相機沒有在或靠近桌子指出了。

ARKit本身並不爲您提供處理此問題的任何幫助。儘管如此,它可以讓你自己完成數學所需的所有信息。您可以獲得飛機的位置,方向和大小,以便計算其四個角點。你可以得到相機的投影矩陣,所以你可以check for whether any point is in the viewing frustum

既然你已經使用SceneKit,不過,也有方法可以得到SceneKit做數學題你...向後工作:

  1. SceneKit給你一個isNode(_:insideFrustumOf:)測試,所以如果你有一個SCNNode的邊界框與您的平面錨點的範圍相匹配,您可以將其與相機一起傳遞(view.pointOfView)以確定節點是否可見。
  2. 要獲得其邊界框的平面錨相匹配的節點時,實現ARSCNViewDelegatedidAdddidUpdate回調來創建/更新SCNPlane其位置和尺寸匹配ARPlaneAnchor的中心和程度。 (不要忘記將飛機側向翻轉,因爲SCNPlane默認爲垂直方向。)
  3. 如果您不想在AR視圖中顯示該平面,請將其材料設置爲透明。
相關問題