现实工具包 - 平面检测

6

在RealityKit中,与ARKit类似,只有在相机检测到某种平整表面后,物体才会显示出来并固定在其上。

我该如何(通过代码)知道相机是否已经检测到了平坦表面?实际上,我想突出可选择区域,但我不确定RealityKit是否允许这样做,不过我知道SceneKit可以。


我认为ARCoachingOverlay是你需要的。这里有一个很好的教程 https://medium.com/@maxxfrazer/realitykit-arcoachingoverlayview-80159d140c 你可以看一下。 - Marcin Kaczmarzyk
1个回答

6

在RealityKit中有一个针对此目的的plane初始化器(和枚举情况):

convenience init(plane alignment: AnchoringComponent.Target.Alignment,
                  classification: AnchoringComponent.Target.Classification, 
                   minimumBounds: SIMD2<Float>) 

/* Where `minimumBounds` is the minimum size of the target plane */

这是ARKit的ARPlaneAnchor的对应物,具有extent属性(表示检测到平面的估计宽度和长度)。但在RealityKit中,它的工作方式略有不同。
在实际代码中,您可以这样使用它:
let anchor = AnchorEntity(.plane([.horizontal, .vertical],
                 classification: [.wall, .table, .floor],
                  minimumBounds: [0.375, 0.375]))

/* Here we create an anchor for detected planes with a minimum area of 37.5 cm2 */

anchor.addChild(semiTranparentPlaneEntity)        // visualising a detected plane
arView.scene.anchors.append(anchor)

注意,alignmentclassification参数符合OptionSet协议。

您始终可以找出平面锚点是否已经创建:

let arView = ARView(frame: .zero)

let anchor = AnchorEntity(.plane(.any, classification: .any, 
                                        minimumBounds: [0.5, 0.5]))
anchor.name = "PlaneAnchor"


let containsOrNot = arView.scene.anchors.contains(where: {
    $0.name == "PlaneAnchor"
})
print(containsOrNot)

print(arView.scene.anchors.count)
print(arView.scene.anchors.first?.anchor?.id)

4
不如持续地进行检测和可视化呢? - Hrabovskyi Oleksandr
嗨@АлександрГрабовский!你说的“连续检测和可视化”是什么意思?请解释一下。 - Andy Jazz
我是指在您探索更多表面时扩展semiTranparentPlaneEntity。我正在寻找像这样的行为:https://developer.apple.com/documentation/arkit/world_tracking/tracking_and_visualizing_planes。我已经发现我可以在`session(_ session: ARSession, didUpdate anchors: [ARAnchor])`函数中跟踪表面几何变化。 - Hrabovskyi Oleksandr
好的,我明白了。我还在考虑这个问题。你可以将它发表为SO问题。 - Andy Jazz
1
@АлександрГрабовский,我们可以使用SceneEvents.Update来持续检测吗? - AnupamChugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接