Использование ARSCNPlaneGeometry для получения SCNPhysicsShape создает форму сферы, а не плоскость

В приложении, использующем ARKitЯ использую ARSCNPlaneGeometry учебный класс update метод получения SCNGeometry из ARPlaneGeometry, Я получаю SCNPhysicsShape из этой геометрии, чтобы использовать в качестве SCNPhysicsBody для плоского узла:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

    // Plane Geometry
    let planeGeometry = ARSCNPlaneGeometry(device: MTLCreateSystemDefaultDevice()!)
    planeGeometry?.update(from: planeAnchor.geometry)
    let planeNode = SCNNode(geometry: planeGeometry)

    // Plane Physics
    planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: planeGeometry!))

    // Add Node to Scene
    node.addChildNode(planeNode)
}

У меня проблема в том, что, несмотря на то, что отображаемый узел плоскости является плоскостью, физическая форма, которая генерируется, не является формой плоскости, а представляет собой шероховатую сферу. Я знаю это, потому что я использую опцию отладки просмотра сцены .showPhysicsShapes,

Я также постоянно обновляю форму геометрии и физики, используя renderer(_:didUpdate:for:) метод ARSCNViewDelegate и форма остается прежней.

Кто-нибудь еще сталкивался с этой проблемой раньше?

1 ответ

Решение

Что ж, кажется, что абстракция формы, которую класс SCNPhysicsShape вычисляет из ARSCNPlaneGeometry, полностью отключена, если вы не поможете ей с опцией. Если вместо:

planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: planeGeometry!))

ты используешь:

planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: planeGeometry!, options: [SCNPhysicsShape.Option.type: SCNPhysicsShape.ShapeType.boundingBox]))

"Приблизительная", хотя и не совсем точная форма получается.

Другие вопросы по тегам