0

この問題は、この問題に関連している可能性があります。しかし、私はその議論に追加するのに十分な評判を持っていません.

固定されたノードの zRotation がシーン スペースで正または負の PI に達する (または近くなる)と、node.physicsBody.allowRotation = false の場合、ノードのローカル zRotation は即座に負または正の 5.497... ラジアンにジャンプします。回転方向について。

ノードが移動している場合、視覚的な結果として、ノードのチェーンが反転したり、ジッターしたり、一般的に誤動作したりします。

ノードが動いていない場合でも、結果は発生しますが、目立った視覚効果はありません。

以下の小さなテストケースで問題を再現しました。

編集:この問題は、一連のボディが固定されている場所に限定されているようです。ここでは、ノードがネストされている場所と、ノードが同じ親を持ち、手動でシリーズに固定されている場所の両方を見てきました。

編集 2:更新シーケンスの過程でノード zRotation 値を出力するようにテスト ケースを変更しました。

編集 3: Apple に確認したところ、これはバグです。

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
4

0 に答える 0