7

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

布娃娃图

每个SKPhysicsJointPin都有shouldEnableLimits = true,我目前分别为lowerAngleLimit和使用 -0.05 和 0.05 的值upperAngleLimit

这很有效,并且可以防止形状过度变形,除非整个图形上下颠倒,在这种情况下,所有关节都会突然尝试收缩,如下所示:

破碎的布娃娃图

当人物完全颠倒时,关节会很快收缩。当他再次旋转回来时,所有关节都恢复正常。为什么会这样?如何保持关节的正确角度?

编辑1:

我只是尝试用 Objective-C 重写项目,以防它是由于一些奇怪的 Swift 错误造成的;事实证明,这个问题仍然在 Objective-C 中表现出来,所以我删除了 Swift 标签。

目前我最好的猜测是,当它们附着的物体在任一方向上旋转超过 180° 时,SpriteKit 会错误地计算关节相对于世界的角度,因此错误的角度被传递给底层 Box2D 关节。

我不确定我是否应该不断更新上下角度限制以匹配他们身体的世界角度,但我似乎不必这样做,因为当身体非常接近倒置时关节停止正常工作。无论如何,我会继续尝试……</p>

编辑2:

我现在相当确定问题的发生是因为 SpriteKit 正在(我猜有充分的理由)修改该zRotation值以使其保持在 -180° 和 180° 之间。例如,如果节点顺时针旋转并达到 -180°,SpriteKit 会自动将其值回绕到 +180°。我相当有信心这种环绕会导致关节行为不正常,我只需要弄清楚如何抵消它......</p>

编辑3:

我已经上传了演示此问题的示例应用程序(包括视频),正如 Apple 最初要求的那样:Xcode Project / Video

4

2 回答 2

0

“我目前分别为 lowerAngleLimit 和 upperAngleLimit 使用 -0.05 和 0.05 的值”

根据文档...

upperAngleLimit - 销接头允许的最大角度,以弧度为单位

...限制以弧度为单位。

0.05 radians = 2.86478898 degrees

所以,你只允许身体总共移动大约 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)

你将不得不修补角度、质量和重力,直到找到一个物体真实移动的最佳位置。

如果您真的想要那么小的运动范围,我会考虑完全禁用它。

circle.physicsBody?.allowsRotation = false
于 2015-03-05T06:57:21.590 回答
0

我可以确认,这是 SpriteKit 中的一个错误。在我的例子中,我使用的是最简单的两个精灵通过销接头连接的场景。不幸的是,它仍在 iOS 9 上发生 :(

于 2015-11-15T07:29:03.613 回答