两个节点之间的冲突同时发生了两次

Posted

技术标签:

【中文标题】两个节点之间的冲突同时发生了两次【英文标题】:Collision between two nodes happened twice at the same time 【发布时间】:2022-01-24 05:50:51 【问题描述】:

在ARkit中,我有子弹节点和目标节点两个节点,

子弹节点在下方

  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

目标节点在下方

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")

我发现当这两个节点相互碰撞时,下面的方法几乎同时连续调用了两次,但应该只发生一次。

func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) 


有时会发生,有时没有,所以我认为可能应该添加一些碰撞精度,有人知道如何做那部分吗?谢谢

【问题讨论】:

这能回答你的问题吗? SpriteKit game crashes when two SKPhysicsContacts are detected 这就解释了。它的预期。 ***.com/questions/39424122/… 谢谢史蒂夫和哈桑 【参考方案1】:

didBegin(contact:) 似乎会为 2 个节点之间的每个接触点调用,所以是的 - 它可能会被调用不止一次。

取决于您在他们联系时所做的事情,将决定如何对您的联系逻辑进行编码以考虑到这一点。

【讨论】:

以上是关于两个节点之间的冲突同时发生了两次的主要内容,如果未能解决你的问题,请参考以下文章

半双工 全双工

避免 D3 强制布局中节点和边之间的碰撞

JQuery的$和其它JS发生冲突的快速解决方法

Apriori算法

“key”是不是在 Java HashMap 中存储了两次?

如何检测精灵节点上特定位置的 SKSpriteNode 之间的冲突?