一种应用 zRotation 以便它相应地影响 SKPhysicsBody 的方法?

A way to apply zRotation so that it affects the SKPhysicsBody accordingly?

假设我有一个代表车轮的 SKSpriteNode,并成功附加了一个圆形 SKPhysicsBody。显然,这种类型是横向滚动的 2d 汽车驾驶 game/simulator。

我想要的是在不借助 SpriteKit 物理引擎的情况下自己计算所有的电机内物理。我想完全控制电机、离合器、变速器等的机械结构,一直到驱动轮的 RPM。

不过,从那时起,我很乐意将控制权交给 SpriteKit 物理引擎,然后计算当旋转的驱动轮接触路面时会发生什么。车子前进,减速,加速and/or车轮打滑,什么情况都行。

计算力学以获得车轮转速是没有问题的。我只是不确定如何从那里继续。

我可以简单地通过在 update: 方法中应用 zRotation 来旋转轮子,如下所示:

self.rearWheelInstance.zRotation += (self.theCar.wheelRPS/6.283 * timeSinceLastUpdate); // revolutions / 2pi = radians

这样我就可以应用我之前计算出的精确每千次展示收入。明显的缺点是,SpriteKit 的物理引擎完全忽略了这种旋转。就其所知,车轮会从一个阶段传送到另一个阶段,因此它不会与路面产生摩擦,也不会与其他 SpriteKit 物理体产生任何其他交互。

另一方面,我可以对车轮施加扭矩:

[self.rearWheelInstance.physicsBody applyTorque: someTorque];

或angular冲动:

[self.rearWheelInstance.physicsBody applyAngularImpulse: someAngularImpulse];

这确实以 SpriteKit 物理引擎理解的方式旋转轮子,从而使其与周围环境正确交互。

但是除非我遗漏了一些明显的东西,否则这会将车轮视为 'free rolling object' 独立于曲轴、变速箱或驱动轴 RPM。但实际上,车轮没有 'choice' 以任何其他转速滚动,而不是通过传动系统传输到车轴的转速(除非变速器处于空档,离合器踏板踩下或离合器处于滑倒,但那些完全是另一个故事)。

所以: 1) 我是否能够以某种方式以 SpriteKit 物理引擎 'understands' 作为旋转运动的方式操纵 zRotation?

2) 我的逻辑是否有明显的缺陷表明这不是我一开始就应该尝试的?如果是这样,您能否指出我的缺陷,以便我采取更好的做法?

简单的答案,将 2d UI 设置(如位置和 zRotation)与动态物理系统混合不会像您注意到的那样得到您想要的结果。如您所述,您需要使用物理模拟的部分,例如脉冲和 angular 动量。

可能对您也有帮助的两块拼图是:

Physics Joints - 这些可以做一些事情,比如将轮子连接到轴上,以便它可以自由旋转,设置旋转限制,但仍然对其施加旋转力。

Dynamically Adjusting Physics Properties - 如增加摩擦力,angular 抑制或在用户踩下刹车时向车轴增加负加速度。

经过相当多的死胡同后,我注意到实际上有一种方法可以以相应地影响物理引擎的方式直接操纵车轮的旋转(而不是施加扭矩或冲击)。

技巧是操纵 physicsBody 的 angularVelocity 属性,像这样:

self.rearWheelInstance.physicsBody.angularVelocity = -self.theCar.wheelRadPS; 
// Wheel's angular velocity, radians per second 
// *-1 just to flip ccw rotation to cw rotation 

这样我就可以直接控制驱动轮的转速,而不会失去它们在 SpriteKit 物理模拟中与其他物体相互作用的能力。这帮助我克服了这个特殊的障碍,我希望它也能帮助其他人。