Использование 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]))
"Приблизительная", хотя и не совсем точная форма получается.