我目前有一个布娃娃图,它由一个父节点(没有附加物理实体)和许多子节点组成,每个子节点都由一个圆体组成.圆圈SKPhysicsJointPin在每个圆圈之间相互连接,如下所示:

每个SKPhysicsJointPin都有shouldEnableLimits = true,并且我目前使用的-0.05和0.05一个值lowerAngleLimit和upperAngleLimit分别.
这种效果非常好并且可以防止形状变形过多,除非整个图形颠倒过来,在这种情况下,所有关节突然试图收缩,如下所示:

当数字完全颠倒时,关节很快收缩.当他再次旋转时,所有关节都恢复正常.为什么会这样?如何在关节上保持正确的角度?
编辑1:
我只是尝试在Objective-C中重写项目,以防它是由于一些奇怪的Swift错误; 结果这个问题仍然在Objective-C中表现出来,所以我删除了Swift标签.
我现在最好的猜测是,当它们所连接的物体在任一方向上旋转超过180°时,SpriteKit会错误地计算关节相对于世界的角度,因此将错误的角度传递给底层Box2D关节.
我不确定我是否应该不断更新低角度和高角度限制以匹配他们身体的世界角度,但似乎我不需要像身体非常接近颠倒一样关节停止正常工作.无论如何,我要继续尝试......
编辑2:
我现在很确定问题出现了,因为SpriteKit(我猜有充分的理由)修改zRotation值使其保持在-180°和180°之间.例如,如果节点顺时针旋转并且达到-180°,SpriteKit会自动将其值恢复到+ 180°.我很相信这种环绕会导致关节表现不规律,我只需要弄清楚如何抵消它......
编辑3:
我已经上传了演示此问题的示例应用程序(包括视频),正如Apple最初要求的那样:Xcode Project/Video
我需要让手臂和手围绕钩子的中心旋转,如下图所示,没有它们分开或改变它们的形状(手臂和手之间的角度没有变化,只是在A处旋转),如下图所示:
我尝试旋转手臂,但这使它们分开并改变形状.您可以在下面查看我的代码:
let hookCategoryName = "hook"
let leftArmCategoryName = "leftArm"
let rightArmCategoryName = "rightArm"
let leftHandCategoryName = "leftHand"
let rightHandCategoryName = "rightHand"
let hookCategory : UInt32 = 0x1 << 0
let leftArmCategory : UInt32 = 0x1 << 1
let rightArmCategory : UInt32 = 0x1 << 2
let leftHandCategory : UInt32 = 0x1 << 3
let rightHandCategory : UInt32 = 0x1 << 4
extension Int {
var degreesToRadians: Double { return Double(self) * .pi / 180 }
}
extension FloatingPoint { …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用sprite kit,为我的想法构建原型.我一直用一个SKPhysicsJointPin将一串物理体连在一起,制作一根绳子(实际上更像是一条自行车链条,但它已经足够好了).在场景中也有很多球,当我点击它们时我可以放下它们.这导致以下结果:

然而,当我丢掉更多球时,链条似乎无法处理它,并且"打破":

发生了什么?文档从未建议SKPhysicsJointPin具有有限的最大强度或弹性或类似.这是sprite工具包中的"bug",还是我使用了错误的方法?
我创建了一个SKSpriteNode的子类.我将该类的实例与SKPhysicsJointLimit类型的关节连接在一起.我在我的GameScene中的didEndContact(联系方式:SKPhysicsContact)中执行此操作:
var joint = SKPhysicsJointLimit.jointWithBodyA(contact.bodyA, bodyB: contact.bodyB, anchorA: pos1!, anchorB: pos2!)
self.physicsWorld.addJoint(joint)
Run Code Online (Sandbox Code Playgroud)
这到目前为止运作良好.然后我来到了我想要从关节中释放节点的地步.根据SKPhysicsBody文档,有一个名为"joints"的属性,它是一个包含SKPhysicsJoint对象的数组.我认为这正是我所需要的,但我无法迭代实例的关节并将它们从physicsWorld中删除.为了完成这项工作,我在自定义SKSpriteNode子类中添加了一个方法.
func freeJoints(world: SKPhysicsWorld){
if let joints = self.physicsBody?.joints {
for joint in joints{
println("found a joint: \(joint)")
// example print:
//found a joint: <PKPhysicsJointRope: 0x7fbe39e95c50>
world.removeJoint(joint as SKPhysicsJoint)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在println()语句之后调用该方法失败,并显示消息"Swift dynamic cast failed".我非常感谢您对如何使用SKPhysicsBody的联合财产的看法.更具体地说:如何使用(强制转换)数组中的项目,以便能够从场景的SKPhysicsWorld中删除它们.
我试图连接两个SKSpriteNode使用的SKPhysicsJointPin在anchorPoint标记为下面的截图绿点.后来我想physicsBody!.dynamic = true在object2上启用object2的"swing动画".


我在创建偶像时遇到困难SKPhysicsJointPin我甚至没有在Xcode中得到错误它不能编译.
这是代码:
import SpriteKit
class GameScene: SKScene, SKPhysicsContactDelegate {
let object1 = SKSpriteNode(imageNamed: "white")
let object2 = SKSpriteNode(imageNamed: "black")
override func didMoveToView(view: SKView) {
// Setup background image
self.backgroundColor = UIColor(hex: 0x60c0f3)
// Setup physics body to the scene (borders)
self.physicsBody = SKPhysicsBody (edgeLoopFromRect: self.frame)
// Change gravity settings of the physics world
self.physicsWorld.gravity = CGVectorMake(0, -9.8)
self.physicsWorld.contactDelegate = self
//===========================================
// White object properties
object1.physicsBody = …Run Code Online (Sandbox Code Playgroud)