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

Sam*_*ari 11 objective-c game-physics ios sprite-kit skphysicsbody

假设我有一个代表车轮的SKSpriteNode,圆形SKPhysicsBody成功连接到它上面.显然,该类型将横向滚动2d汽车驾驶游戏/模拟器.

我想要的是自己计算所有的电机内物理,而不必使用SpriteKit物理引擎.我想完全控制如何计算电机,离合器,变速箱等的机械装置,一直到驱动轮的转速.

从那时起,我很乐意控制SpriteKit物理引擎,然后计算当旋转驱动轮接触道路表面时会发生什么.无论情况如何,汽车前进,减速,加速和/或车轮打滑.

计算获得车轮转速的机制是没有问题的.我只是不确定如何从那里继续.

我可以通过在update:方法中应用zRotation来旋转方向盘,如下所示:

self.rearWheelInstance.zRotation += (self.theCar.wheelRPS/6.283 * timeSinceLastUpdate); // revolutions / 2pi = radians
Run Code Online (Sandbox Code Playgroud)

这样我就可以应用我之前计算过的精确RPM.明显的缺点是,SpriteKit的物理引擎完全没有注意到这种旋转.对于它所知道的一切,轮子从一个相位传送到下一个相位,因此它不会产生与路面的摩擦或与其他SpriteKit物理实体的任何其他交互.

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

[self.rearWheelInstance.physicsBody applyTorque: someTorque];
Run Code Online (Sandbox Code Playgroud)

或角度冲动:

[self.rearWheelInstance.physicsBody applyAngularImpulse: someAngularImpulse];
Run Code Online (Sandbox Code Playgroud)

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

但除非我遗漏了一些明显的东西,否则它会将车轮视为一个独立于曲轴,传动装置或驱动轴转速的"自由滚动物体".但实际上,车轮没有"选择"在任何其他转速下滚动,而不是通过动力传动系统传递到轴上(除非变速器处于空档,离合器踏板踩下或离合器打滑,但这些都是另一个故事).

所以:1)我能以某种方式操纵zRotation,使SpriteKit物理引擎"理解"为旋转运动吗?

要么

2)我的逻辑中是否有明显的缺陷表明这不是我应该首先尝试的?如果是这样,你能不能指出我的缺陷,以便我可以采取更好的做法?

Coo*_*ham 9

简单的回答,将2d UI设置(如位置和zRotation)与动态物理系统混合在一起并不会产生您想要的结果,正如您所注意到的那样.正如您所说,您需要使用物理模拟的各个部分,如脉冲和角动量.

可能对您有帮助的两个难题是:

物理接头 - 这些可以做一些事情,比如将车轮连接到轴上,以便它可以自由旋转,设定旋转限制,但仍然在其上施加旋转力.

动态调整物理属性 - 例如在用户按下制动器时增加摩擦,角度阻尼或向轴加负加速度.


Sam*_*ari 4

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

诀窍是操纵轮子的物理主体的 angleVelocity 属性,如下所示:

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

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