Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sprite kit 当shouldEnableLimits为true且设置了lowerAngleLimit和upperAngleLimit时,SKPhysicsJointPin的行为不正确_Sprite Kit_Game Physics_Skphysicsbody_Skphysicsjoint - Fatal编程技术网

Sprite kit 当shouldEnableLimits为true且设置了lowerAngleLimit和upperAngleLimit时,SKPhysicsJointPin的行为不正确

Sprite kit 当shouldEnableLimits为true且设置了lowerAngleLimit和upperAngleLimit时,SKPhysicsJointPin的行为不正确,sprite-kit,game-physics,skphysicsbody,skphysicsjoint,Sprite Kit,Game Physics,Skphysicsbody,Skphysicsjoint,我现在有一个碎布玩偶,它由一个父节点(没有附加物理实体)和许多子节点组成,每个子节点都由一个圆实体组成。使用每个圆之间的SKPhysicsJointPin将这些圆相互连接,因此: 每个SKPhysicsJointPin都有shouldEnableLimits=true,我目前分别为下限和上限使用-0.05和0.05的值 这非常有效,可以防止形状变形过多,除非图形作为一个整体倒置,在这种情况下,所有关节突然尝试收缩,如下所示: 另见: 当图形完全颠倒时,关节会很快收缩。当他再次旋转时,所有

我现在有一个碎布玩偶,它由一个父节点(没有附加物理实体)和许多子节点组成,每个子节点都由一个圆实体组成。使用每个圆之间的
SKPhysicsJointPin
将这些圆相互连接,因此:

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

这非常有效,可以防止形状变形过多,除非图形作为一个整体倒置,在这种情况下,所有关节突然尝试收缩,如下所示:

  • 另见:
当图形完全颠倒时,关节会很快收缩。当他再次旋转时,所有关节都恢复正常。为什么会发生这种情况?如何在接头上保持正确的角度

编辑1:

我只是试着用Objective-C重写这个项目,以防它是由于一些奇怪的Swift bug引起的;事实证明这个问题在Objective-C中仍然存在,所以我删除了Swift标记

我目前的最佳猜测是,当连接到关节的实体在任一方向上旋转超过180°时,SpriteKit会错误地计算关节相对于世界的角度,因此错误的角度会传递到基础Box2D关节

我不确定我是否应该不断更新角度下限和上限,以匹配他们身体的世界角度,但似乎我不必这样做,因为当身体非常接近倒置时,关节会停止正常工作。不管怎样,我要继续试验

编辑2:

我现在相当肯定出现了这个问题,因为SpriteKit(我想有充分的理由)正在修改
zRotation
值,使其保持在-180°和180°之间。例如,如果节点顺时针旋转,并达到-180°,SpriteKit会自动将其值包装回+180°。我很有信心这种缠绕会导致关节行为不稳定,我只需要想办法抵消它

编辑3:

我已经上传了示例应用程序(包括视频),它演示了这个问题,正如苹果最初要求的那样://

“我目前分别使用-0.05和0.05的值表示lowerAngleLimit和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

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

你需要使用更长的物理体而不是圆。每个物理体应该代表手臂、腿、脚、躯干等。你自己的身体是由你在这里创建的骨骼结构组成的吗?我意识到它不是人体的精确表示,在这种情况下它不应该是!我主要关心的是奇怪的behaviour的关节目前。你是否尝试禁用单个身体的重力?虽然我计划最终使用重力,但当我找出关节的问题时,重力作为一个整体暂时被禁用。即使启用重力,问题仍然会显现出来。你是如何将角色颠倒过来的?谢谢r你的答案,但我尝试了很多不同的角度;一个小角度不是原因。我相当确定这个问题是由SpriteKit的身体旋转角度标准化造成的,当它们超过极限时,会混淆基本的Box2D关节。无论如何,我不认为~5º对于物理引擎来说太小,无法计算,我能告诉你的是,我在SpriteKit中实现了一个碎布玩偶,当它倒转时,我没有任何问题。你试图做的是100%可能的。当我提交错误报告时,苹果要求提供一个示例应用程序/视频-我只是为mo修复了它dern Swift并重新上传(仍然以同样的方式失败),请随意查看(添加原始帖子的链接);我对你的任何见解都很感兴趣!我会在有空的时候看看是否能让它工作。如果不能,我对跟踪bug很感兴趣,所以谢谢。我无法让它与你设定的体型和角度一起工作。我确实注意到体型和角度越大,它发生的次数就越少,直到完全没有。我还注意到它似乎只发生在“锁链”中关于身体,这让我想到了我的新理论,即在对身体上的第一个关节施加限制的过程中,它会将同一身体上的另一个关节拉离范围。听起来像是一个bug。一个有趣的实验是看看这个问题是否发生在没有SpriteKit的box2d中。如果是这样,可能是引擎的限制。如果不是,这是一个错误Spritekit Bug也是我不得不在我的项目中使用花栗鼠的原因。