有兩種方式「失去」的表面,所以有一個以上的方式來處理這樣的問題。
正如其他答案指出,有一個ARSCNViewDelegate
方法時錨從AR會話中刪除該ARKit電話。但是,在運行會話期間,ARKit不會刪除飛機錨點 - 一旦檢測到飛機,它會假定飛機始終在那裏。所以這方法被調用,僅當:
- 您可以通過它傳遞直接刪除飛機錨
session.remove(anchor:)
,或
- 您通過與
.removeExistingAnchors
選項再次運行重置會話。
我不知道前者是一個好主意,但後者是重要的處理,所以你可能希望你的委託來應付自如。
也可以通過具有它傳遞出的視圖「丟失」的表面 - 例如,ARKit檢測表,然後用戶接通周圍所以相機沒有在或靠近桌子指出了。
ARKit本身並不爲您提供處理此問題的任何幫助。儘管如此,它可以讓你自己完成數學所需的所有信息。您可以獲得飛機的位置,方向和大小,以便計算其四個角點。你可以得到相機的投影矩陣,所以你可以check for whether any point is in the viewing frustum。
既然你已經使用SceneKit,不過,也有方法可以得到SceneKit做數學題你...向後工作:
- SceneKit給你一個
isNode(_:insideFrustumOf:)
測試,所以如果你有一個SCNNode
的邊界框與您的平面錨點的範圍相匹配,您可以將其與相機一起傳遞(view.pointOfView
)以確定節點是否可見。
- 要獲得其邊界框的平面錨相匹配的節點時,實現
ARSCNViewDelegate
didAdd
和didUpdate
回調來創建/更新SCNPlane
其位置和尺寸匹配ARPlaneAnchor
的中心和程度。 (不要忘記將飛機側向翻轉,因爲SCNPlane
默認爲垂直方向。)
- 如果您不想在AR視圖中顯示該平面,請將其材料設置爲透明。
你的意思是說,如果沒有表面檢測,這個方法會被調用嗎?我試着把這個方法登錄。我試過的是我集中在地板上,表面檢測發生了,然後我把焦點集中在其他地方,這不是水平表面,而且這種方法沒有被調用 – yaali
如果你發現任何表面或平面被從場景中移除,這種方法應該會丟失本身。如果發生「丟失」,並且電話在搖晃後失去了飛機/地面本身的位置,它仍然可以在AR世界的場景中使用,但手機失去了跟蹤並認爲地面是在別處。 –
所以這個方法可能會在表面跟蹤由於晃動而丟失時被調用。我對嗎? – yaali