Sprite kit SKNode zRotation值在pinned=true和allowsRotation=false的情况下跳转

Sprite kit SKNode zRotation值在pinned=true和allowsRotation=false的情况下跳转,sprite-kit,skphysicsbody,skphysicsjoint,Sprite Kit,Skphysicsbody,Skphysicsjoint,这个问题很可能与此有关。 然而,我没有足够的声誉来增加这一讨论 当固定节点的zRotation在场景空间中达到或可能接近正或负PI,并且node.physicsBody.allowRotation=false时,节点的局部zRotation立即跳到负或正5.497。。。弧度,取决于旋转方向 如果节点正在移动,则可视结果是节点链翻转、抖动和/或通常出现错误行为 如果节点不移动,结果仍会发生,但没有明显的视觉效果 我在下面的一个小测试用例中重新创建了这个问题 编辑:此问题似乎仅限于在系列中固定实体的

这个问题很可能与此有关。 然而,我没有足够的声誉来增加这一讨论

当固定节点的zRotation在场景空间中达到或可能接近正或负PI,并且node.physicsBody.allowRotation=false时,节点的局部zRotation立即跳到负或正5.497。。。弧度,取决于旋转方向

如果节点正在移动,则可视结果是节点链翻转、抖动和/或通常出现错误行为

如果节点不移动,结果仍会发生,但没有明显的视觉效果

我在下面的一个小测试用例中重新创建了这个问题

编辑:此问题似乎仅限于在系列中固定实体的位置。我在这里看到了节点嵌套的情况,以及节点具有相同的父节点并手动固定在一个系列中的情况

编辑2:更改测试用例以在更新序列过程中输出节点zRotation值

编辑3:与苹果确认这是一个错误

import SpriteKit

class GameScene: SKScene {

    var nodes :[SKNode]

    required init?(coder aDecoder: NSCoder) {
        nodes = Array<SKNode>()
        super.init(coder: aDecoder)
    }

    override func didMoveToView(view: SKView) {

        NSLog("Create nodes")

        physicsWorld.speed = 0.5

        var prev = self as SKNode
        var newNode:SKShapeNode

        for n in 0...5{
            newNode = SKShapeNode(circleOfRadius: 20)
            newNode.name = String(n)
            newNode.position = (n==0 ? CGPoint(x: 400, y: 400):CGPoint(x: 50, y: 0))
            newNode.zRotation = CGFloat(M_PI/4)
            prev.addChild(newNode)
            prev = newNode

            newNode.physicsBody = SKPhysicsBody(circleOfRadius: 20, center: CGPoint(x: 0, y: 0))
            newNode.physicsBody?.affectedByGravity = true
            newNode.physicsBody?.dynamic = (n==0 ? false : true)
            newNode.physicsBody?.pinned = true
            newNode.physicsBody?.affectedByGravity = false
            newNode.physicsBody?.allowsRotation = (n==1 ? true : false) // allowing rotation removes issue
            newNode.physicsBody?.collisionBitMask = 0x00000000
            nodes.append(newNode)
            NSLog("node \(newNode.name):\(newNode.zRotation)")

        }

    }

    override func update(currentTime: NSTimeInterval) {
        NSLog("update")
        for node in nodes{
            NSLog("node \(node.name):\(node.zRotation)")
        }
    }

    override func didEvaluateActions() {
        NSLog("didEvaluateActions")
        for node in nodes{
            NSLog("node \(node.name):\(node.zRotation)")
        }
    }

    override func didSimulatePhysics() {
        NSLog("didSimulatePhysics")
        for node in nodes{
            NSLog("node \(node.name):\(node.zRotation)")
        }
    }

    override func didApplyConstraints() {
        NSLog("didApplyConstraints")
        for node in nodes{
            NSLog("node \(node.name):\(node.zRotation)")
        }
    }

}
输出:

Create nodes
node Optional("0"):0.785398185253143
node Optional("1"):0.785398185253143
node Optional("2"):0.785398185253143
node Optional("3"):0.785398185253143
node Optional("4"):0.785398185253143
node Optional("5"):0.785398185253143
update
node Optional("0"):0.785398185253143
node Optional("1"):0.785398185253143
node Optional("2"):0.785398185253143
node Optional("3"):0.785398185253143
node Optional("4"):0.785398185253143
node Optional("5"):0.785398185253143
didEvaluateActions
node Optional("0"):0.785398185253143
node Optional("1"):0.785398185253143
node Optional("2"):0.785398185253143
node Optional("3"):0.785398185253143
node Optional("4"):0.785398185253143
node Optional("5"):0.785398185253143
didSimulatePhysics
node Optional("0"):0.785398185253143
node Optional("1"):0.785398185253143
node Optional("2"):0.785398185253143
node Optional("3"):-5.49778699874878   <<<<<
node Optional("4"):0.785398006439209
node Optional("5"):0.785398006439209

我解决了这个问题,用孩子们的身体创造了一个单一的物理实体。苹果已经解决了我在这个问题上的问题。目前还没有解决这一问题的计划。