es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 delegado contact 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 de physicsBody, como SCNBox o SCNCylinder, en lugar de SCNSphere para el nodo target. Además, puede intentar usar una bandera para asegurarse de que el método didBegin 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.

Comments are closed.