如何应用zRotation,使其相应地影响SKPhysicsBody?

11

假设我有一个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)我的逻辑是否存在明显的缺陷,表明我首先不应该尝试这样做?如果是这样,请指出缺陷,这样我就可以采用更好的实践方法了吗?

2个回答

9
简单的回答是,将类似于位置和zRotation等2D UI设置与动态物理系统混合使用,并不能产生您想要的结果,正如您所注意到的那样。就像您所说的一样,您需要使用物理模拟的部分,例如推力和角动量。
可能还有两个帮助您的谜题的部分: 物理关节(Physics Joints)- 可以做到连接车轮和轴,使其可以自由旋转,设置旋转限制,但仍对其施加旋转力。 动态调整物理属性(Dynamically Adjusting Physics Properties) - 例如,在用户按下刹车时增加摩擦力、角减震或向轴添加负加速度。

谢谢,我有一种直觉,这将是情况。我仍在考虑何时将控制权交给SK物理引擎的确切阶段,以及如何在不失去我追求的准确性的情况下做到这一点。 - Samuli Viitasaari

4

经过一些失败的尝试之后,我发现其实有一种方法可以直接操纵车轮的旋转(而不是施加扭矩或冲击),这种方式会影响物理引擎。

诀窍在于操纵车轮的物理主体的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物理模拟中其他物体互动的能力。这帮助我克服了这个特定的障碍,希望也能帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接