如何查找在iOS 11中使用Scenekit是否无法使用ARKit检测到的曲面?

问题描述:

我正在使用ARKit-SceneKit处理应用程序。在我的应用程序中,我已经启用了表面检测(我跟着apple提供的放置对象样本)。如何查找检测到的表面是否不再可用?也就是说,最初只有当用户在ARSession中检测到表面时,我才允许他放置3D对象。如何查找在iOS 11中使用Scenekit是否无法使用ARKit检测到的曲面?

但是,如果用户快速移动或聚焦某处,检测到的表面区域就会丢失。在这种情况下,如果用户试图放置另一个物体,我不应该允许他放置它,直到他再次扫描地板并修正表面。

是否有任何代表可以让我们知道检测到的表面不再可用?

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

它具有的功能是renderer(_:didRemove:for:),当ARAnchor已被删除时触发。当表面被移除时,您可以使用此功能执行某些操作。

ARSCNViewDelegate Link

+0

你的意思是说,如果没有表面检测,这个方法会被调用吗?我试着把这个方法登录。我试过的是我集中在地板上,表面检测发生了,然后我把焦点集中在其他地方,这不是水平表面,而且这种方法没有被调用 – yaali

+0

如果你发现任何表面或平面被从场景中移除,这种方法应该会丢失本身。如果发生“丢失”,并且电话在摇晃后失去了飞机/地面本身的位置,它仍然可以在AR世界的场景中使用,但手机失去了跟踪并认为地面是在别处。 –

+0

所以这个方法可能会在表面跟踪由于晃动而丢失时被调用。我对吗? – yaali

有两种方式“失去”的表面,所以有一个以上的方式来处理这样的问题。


正如其他答案指出,有一个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视图中显示该平面,请将其材料设置为透明。