Rob*_*ert 7 game-physics sprite-kit skphysicsbody skphysicsjoint
我目前有一个布娃娃图,它由一个父节点(没有附加物理实体)和许多子节点组成,每个子节点都由一个圆体组成.圆圈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
“我目前分别对 lowerAngleLimit 和 upperAngleLimit 使用值 -0.05 和 0.05”
根据文档...
upperAngleLimit - 销接头允许的最大角度,以弧度为单位。
...限制以弧度为单位。
0.05 radians = 2.86478898 degrees
Run Code Online (Sandbox Code Playgroud)
因此,您只允许物体总共移动大约 5 度。这是一个极小的范围。根据我的经验,当身体被迫超出范围时,SpriteKit 就会开始这种奇怪的捕捉行为。
我不认为这种行为是倒立身体所特有的。我最好的猜测是,物理引擎没有足够的帧速率在一帧中施加重力并在下一帧中移动到范围之外之前捕获身体。
你应该增加范围。我更喜欢以度数来指定它。例如...
func degreesToRadians(degrees: CGFloat) -> CGFloat {
return CGFloat(M_PI) * degrees / 180.0
}
pinJoint.shouldEnableLimits = true
pinJoint.lowerAngleLimit = degreesToRadians(-30.0)
pinJoint.upperAngleLimit = degreesToRadians(180.0)
Run Code Online (Sandbox Code Playgroud)
你必须调整角度、质量和重力,直到找到物体真实移动的最佳位置。
如果你真的想要那么小的运动范围,我会考虑完全禁用它。
circle.physicsBody?.allowsRotation = false
Run Code Online (Sandbox Code Playgroud)