SKPhysicsJointPin - залипание узлов и растяжение суставов

У меня есть пара вопросов, и они могут быть связаны, а могут и не быть. У меня есть персонаж-альпинист, у него есть туловище, левая рука, правая рука, левая рука и правая рука. Каждая рука имеет SKPhysicsJointPin на руке, а каждая рука имеет SKPhysicsJointPin на туловище. На все руки, кроме двух, действует гравитация, поэтому тело свисает с рук. Я использую SKAction, чтобы поднять каждую руку и подтянуть тело вверх. Одна рука заблокирована, а другая свободно двигается. Запертая рука будет означать, что вы «держитесь» за камень. Сначала я использовал прямоугольники, чтобы проверить это. Суставы начинали разъединяться всякий раз, когда я «тянулся» слишком далеко. Чтобы исправить это, я ограничил, насколько далеко он может подниматься за раз, чтобы суставы оставались вместе. Я загрузил несколько изображений, чтобы заменить прямоугольники, и они используют альфа-маски, чтобы отобразить их реальную форму. Теперь, когда я тестирую, торс застревает, как только он немного качается влево. Суставы начнут растягиваться, а кисти и руки начнут расходиться. Иногда проясняет все это и вспоминает себя, но все суставы все равно расходятся.

Почему может произойти такое изменение при переходе от прямоугольников к изображениям? Это ошибка? Как я могу использовать эти суставы таким образом, чтобы они не разошлись вот так? Я возился со всеми настройками, включая удаление всех ограничений и еще много чего, но все равно та же проблема.

        torso = (self.childNode(withName: "yeti_torso_1") as? SKSpriteNode)!
        //torso.physicsBody = SKPhysicsBody(texture: torso.texture!,size: torso.texture!.size())
        torso.physicsBody?.isDynamic = true
        torso.physicsBody?.usesPreciseCollisionDetection = true
        torso.physicsBody?.collisionBitMask = noCategory
        let constraint = SKConstraint.zRotation(SKRange(lowerLimit: degreesToRadians(degrees: -30.0), upperLimit: degreesToRadians(degrees: 30.0)))
        torso.constraints = [constraint]

        leftHand = (self.childNode(withName: "yeti_left_hand_regular") as? SKSpriteNode)!
        leftHand.physicsBody?.collisionBitMask = noCategory


        leftArm = (self.childNode(withName: "yeti_left_arm") as? SKSpriteNode)!
        leftArm.physicsBody?.collisionBitMask = noCategory
        leftArm.zPosition = 2

        rightHand = (self.childNode(withName: "yeti_right_hand_regular") as? SKSpriteNode)!
        rightHand.physicsBody?.collisionBitMask = noCategory


        rightArm = (self.childNode(withName: "yeti_right_arm") as? SKSpriteNode)!
        rightArm.physicsBody?.collisionBitMask = noCategory
        rightArm.zPosition = 2

         //Left Wrist Joint
         let leftWristJoint = SKPhysicsJointPin.joint(
           withBodyA: leftHand.physicsBody!,
           bodyB: leftArm.physicsBody!,
           anchor: CGPoint(
             x: leftHand.frame.midX-10,
             y: leftHand.frame.midY-10))
         leftWristJoint.shouldEnableLimits = true
         leftWristJoint.lowerAngleLimit = degreesToRadians(degrees: 0.0)
         leftWristJoint.upperAngleLimit = degreesToRadians(degrees: 90.0)
         leftWristJoint.frictionTorque = 1


         self.physicsWorld.add(leftWristJoint)


        //Right Wrist Joint
        let rightWristJoint = SKPhysicsJointPin.joint(
          withBodyA: rightHand.physicsBody!,
          bodyB: rightArm.physicsBody!,
          anchor: CGPoint(
            x: rightHand.frame.midX+10,
            y: rightHand.frame.midY-10))

        rightWristJoint.shouldEnableLimits = true
        rightWristJoint.lowerAngleLimit = degreesToRadians(degrees: 0.0)
        rightWristJoint.upperAngleLimit = degreesToRadians(degrees: 90.0)
        rightWristJoint.frictionTorque = 1

        self.physicsWorld.add(rightWristJoint)

        //Left Arm Joint
          let leftArmJoint = SKPhysicsJointPin.joint(
            withBodyA: torso.physicsBody!,
            bodyB: leftArm.physicsBody!,
            anchor: CGPoint(
              x: torso.frame.minX+100,
              y: torso.frame.maxY-110))
          leftArmJoint.shouldEnableLimits = true
         // leftArmJoint.lowerAngleLimit = degreesToRadians(degrees: -145.0)
          //leftArmJoint.upperAngleLimit = degreesToRadians(degrees: 80.0)
          leftArmJoint.frictionTorque = 1
          self.physicsWorld.add(leftArmJoint)

          //Right Arm Joint
          let rightArmJoint = SKPhysicsJointPin.joint(
            withBodyA: torso.physicsBody!,
            bodyB: rightArm.physicsBody!,
            anchor: CGPoint(
              x: torso.frame.maxX-50,
              y: torso.frame.maxY-110))
          rightArmJoint.shouldEnableLimits = true
          //rightArmJoint.lowerAngleLimit = degreesToRadians(degrees: -80.0)
         // rightArmJoint.upperAngleLimit = degreesToRadians(degrees: 145.0)
          rightArmJoint.frictionTorque = 1

          self.physicsWorld.add(rightArmJoint)

Рука перемещается путем перетаскивания на экране, чтобы поднять руку.

        let td = CGVect(touchBegan,touchCurrent)
        let move = SKAction.move(by: td, duration: 0)
        hand.run(move)

SKPhysicsJointPin растяжение


person kirkage    schedule 01.11.2019    source источник
comment
Создание SKPhysicsBody из текстуры имеет проблемы с версиями 13.0, 13.1 и (если изображение находится в атласе текстур) 13.2. Если прямоугольники работают, а создание тела из текстуры — нет, я бы с подозрением отнесся к этой ошибке. См., например, Проблемы с комплектом спрайтов IOS 13.   -  person bg2b    schedule 01.11.2019
comment
Ссылка отсутствовала выше: stackoverflow.com/questions/58062098/ ios-13-sprite-kit-issues   -  person bg2b    schedule 01.11.2019