RealityKit - Обнаружение самолета - PullRequest
1 голос
/ 19 апреля 2020

В RealityKit, похожем на ARKit, объекты не будут отображаться, пока камера не обнаружит какую-то плоскую поверхность. Как только камера обнаружит эту поверхность, объекты будут показаны и прикреплены к ней.

Как узнать (по коду), обнаружила ли камера плоскую поверхность? На самом деле, я хочу выделить область, которую можно выбрать, но я не уверен, что RealityKit действительно позволяет вам это делать, я знаю, что SceneKit делает то же самое.

1 Ответ

1 голос
/ 19 апреля 2020

Для этой цели в 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 */

Это аналог ARPlaneAnchor ARKit со свойством 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)

Обратите внимание, что аргументы alignment и classification соответствуют 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)
...