假设我有一个SKSpriteNode,代表一辆汽车的车轮,并且已经成功附加了一个圆形SKPhysicsBody。这个游戏/模拟器是侧向滚动的2D汽车驾驶游戏/模拟器。
我的目标是在尚未使用SpriteKit物理引擎的情况下自己计算发动机中的所有物理效应。我想完全掌控如何计算发动机、离合器、变速器等机械部件,直到驱动轮的RPM。
从那一点开始,我很乐意将控制权交给SpriteKit物理引擎,然后它会计算当旋转的驱动轮接触到路面时会发生什么。汽车前进、减速、加速和/或轮子打滑,具体情况视情况而定。
计算车轮RPM的机械部分不成问题。但我不确定该如何继续进行。
我能够通过在update:方法中应用zRotation来简单地旋转轮子,就像这样:
self.rearWheelInstance.zRotation += (self.theCar.wheelRPS/6.283 * timeSinceLastUpdate); // revolutions / 2pi = radians
这样,我就能够应用之前计算出的精确转速。显而易见的缺点是,SpriteKit的物理引擎完全不知道这个旋转。它所知道的只有,车轮从一个相位瞬间跳转到下一个相位,因此它不会与路面或任何其他SpriteKit物理实体产生摩擦,或者与其他SpriteKit物理实体产生任何其他交互。
另一方面,我可以对车轮施加扭矩:
[self.rearWheelInstance.physicsBody applyTorque: someTorque];
或者角动量冲量:
[self.rearWheelInstance.physicsBody applyAngularImpulse: someAngularImpulse];
这确实以SpriteKit物理引擎理解的方式旋转车轮,从而使其正确地与周围环境互动。
但是除非我漏掉了一些显而易见的东西,否则这将把车轮视为独立于曲轴、变速器或传动轴转速的“自由滚动对象”。然而,在现实中,车轮没有“选择”以任何其他转速滚动,而只能滚动传递到传动系统至轴端的转速(除非变速器处于空挡,离合踏板被按下,或者离合器打滑,但这是另一个故事)。
所以: 1)我能否以SpriteKit物理引擎“理解”的方式操纵zRotation,使其呈现旋转运动?
或者
2)我的逻辑是否存在明显的缺陷,表明我首先不应该尝试这样做?如果是这样,请指出缺陷,这样我就可以采用更好的实践方法了吗?