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

Ios 如何应用zRotation使其相应地影响SKPhysicsBody?,ios,objective-c,sprite-kit,game-physics,skphysicsbody,Ios,Objective C,Sprite Kit,Game Physics,Skphysicsbody,假设我有一个代表汽车车轮的SKSpriteNode,它成功地连接了一个圆形SKPhysicsBody。显然,这类游戏将是横向滚动的2d汽车驾驶游戏/模拟器 我想要的是自己计算所有的电机物理,而不用借助SpriteKit物理引擎。我想保持对如何计算电机、离合器、变速箱等力学的完全控制,一直到驱动轮的转速 不过,从那时起,我很乐意控制SpriteKit物理引擎,它将计算当旋转驱动轮在路面上行驶时会发生什么。汽车前进、减速、加速和/或车轮打滑,无论情况如何 计算机械以获得车轮转速是没有问题的。我只是不

假设我有一个代表汽车车轮的SKSpriteNode,它成功地连接了一个圆形SKPhysicsBody。显然,这类游戏将是横向滚动的2d汽车驾驶游戏/模拟器

我想要的是自己计算所有的电机物理,而不用借助SpriteKit物理引擎。我想保持对如何计算电机、离合器、变速箱等力学的完全控制,一直到驱动轮的转速

不过,从那时起,我很乐意控制SpriteKit物理引擎,它将计算当旋转驱动轮在路面上行驶时会发生什么。汽车前进、减速、加速和/或车轮打滑,无论情况如何

计算机械以获得车轮转速是没有问题的。我只是不知道如何从那里继续下去

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

self.rearWheelInstance.zRotation += (self.theCar.wheelRPS/6.283 * timeSinceLastUpdate); // revolutions / 2pi = radians
通过这种方式,我能够应用我先前计算的精确RPM。明显的缺点是,SpriteKit的物理引擎完全忽略了这种旋转。据它所知,车轮从一个阶段传送到下一个阶段,因此它不会与路面产生摩擦,也不会与其他SpriteKit物理体产生任何其他交互作用

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

[self.rearWheelInstance.physicsBody applyTorque: someTorque];
或角脉冲:

[self.rearWheelInstance.physicsBody applyAngularImpulse: someAngularImpulse];
这确实以SpriteKit物理引擎能够理解的方式旋转车轮,从而使其与周围环境正确交互

但除非我遗漏了一些明显的东西,否则这会将车轮视为独立于曲轴、变速箱或驱动轴转速的“自由滚动物体”。然而,实际上,除了通过传动系传输到车轴的转速外,车轮没有任何其他转速的滚动“选择”(除非变速箱处于空档、离合器踏板踩下或离合器打滑,但这完全是另一回事)

因此: 1) 我是否能够以SpriteKit物理引擎“理解”为旋转运动的方式操纵zRotation


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

简单的回答是,将2d UI设置(如位置和旋转)与动态物理系统混合在一起不会得到你想要的结果,正如你所注意到的那样。正如你们所说的,你们需要使用物理模拟的片段,比如冲量和角动量

谜题的两个部分也可能对您有所帮助:

-这些可以做一些事情,比如将车轮连接到轴上,使其能够自由旋转,设置旋转限制,但仍会在其上施加旋转力


-就像用户踩下制动器时增加摩擦、角度阻尼或增加轴的负加速度一样。

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

诀窍是操纵轮子物理体的角度速度特性,如下所示:

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

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

谢谢你,我有种直觉,我会这样做的。我仍然在思考控制SK物理引擎的确切阶段,以及如何做到这一点而不失去我追求的准确性。