La colisión entre dos nodos ocurrió dos veces al mismo tiempo.
En ARKit, tengo dos nodos, como el nodo de bala y el nodo objetivo,
El nodo de bala se muestra a continuación
let body = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(node: bullet, options: nil))
body.isAffectedByGravity = false
bullet.physicsBody = body
bullet.physicsBody?.applyForce(SCNVector3(orientation.x*power, orientation.y*power, orientation.z*power), asImpulse: true)
bullet.physicsBody?.categoryBitMask = BitMaskCategory.bullet.rawValue
bullet.physicsBody?.contactTestBitMask = BitMaskCategory.target.rawValue
bullet.physicsBody?.collisionBitMask = BitMaskCategory.target.rawValue
El nodo objetivo se muestra a continuación
let boundingSphere = targetNode!.boundingSphere;
let radius = boundingSphere.radius;
let center = boundingSphere.center;
let sphereShape = SCNSphere(radius: CGFloat(radius));
var shape = SCNPhysicsShape(geometry: sphereShape, options: [SCNPhysicsShape.Option.scale : targetNodeScale * 1.1])
targetNode?.physicsBody = SCNPhysicsBody(type: .dynamic,shape: shape)
targetNode?.physicsBody?.isAffectedByGravity = false
targetNode?.physicsBody?.categoryBitMask = BitMaskCategory.target.rawValue
targetNode?.physicsBody?.contactTestBitMask = BitMaskCategory.bullet.rawValue | BitMaskCategory.target.rawValue
targetNode?.physicsBody?.collisionBitMask = BitMaskCategory.target.rawValue | BitMaskCategory.bullet.rawValue
targetNode?.setValue(0, forKey: "hitCount")
Y descubrí que cuando estos dos nodos chocan entre sí, el siguiente método se invocó dos veces casi al mismo tiempo consecutivamente, pero debería suceder solo una vez.
func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {
}
Y a veces sucedía, otras veces no, así que supongo que podría haber alguna precisión de colisión que deba agregarse, ¿alguien sabe cómo hacer esa parte? Gracias.
davy.ai
Como modelo de lenguaje de IA, no tengo experiencia personal en programación, pero puedo sugerir algunas posibles soluciones para su problema. En primer lugar, puede intentar aumentar el valor de la propiedad
collisionMargin
del delegadocontact
tanto para los nodos bullet como para los nodos target para aumentar la precisión de colisión. Otra solución es experimentar con diferentes formas dephysicsBody
, comoSCNBox
oSCNCylinder
, en lugar deSCNSphere
para el nodo target. Además, puede intentar usar una bandera para asegurarse de que el métododidBegin
se llame solo una vez para cada colisión. Por último, también puede verificar si hay otros cuerpos o nodos físicos que puedan interferir con la detección de colisiones y eliminarlos si es necesario.