根据SKSpriteNode

时间:2015-10-21 17:59:36

标签: sprite-kit game-physics skphysicsbody

我在太空中有一个节点(没有角度阻尼,没有摩擦,没有重力),我在1秒钟内施加一个扭矩(20牛顿米)。它开始旋转并将永远持续下去。如果我施加反力(-20牛顿米),它就会完全停止。

如果我不知道最初施加了多少角度扭矩(例如它与另一个物体碰撞),我怎样才能确定应用的反向扭矩是什么以使物体停止?我尝试了angularVelocity * mass,这很接近......但总是有点害羞(比如我错过了什么):

-physicsBody!.angularVelocity*physicsBody!.mass

如何确定用于移除所有物体旋转的角动量(扭矩)?

3 个答案:

答案 0 :(得分:1)

在我的游戏中,我使用主动制动来管理节点随时间的运动。我在update()函数中执行此操作。根据您的要求,我提出了这个答案:

let X = -0.2  // This needs to be customized by your needs .. how fast you want to stop.
var need_braking_list : [SKSpriteNode] = []   // Append your spinning nodes here

override func update() {
    for (index,node) in need_braking_list {
        // We're almost stopped, so force a stop or this goes on forever.
        if node.physicsBody?.angularVelocity < 0.1 &&
               node.physicsBody?.angularVelocity > (-0.1)
        {
             node.physicsBody?.angularVelocity = 0
             need_braking_list.removeAtIndex(index)
        // Apply some braking ... screeech
        } else {
            let impulse_factor = node.physicsBody?.angularVelocity * (X)
            node.physicsBody?.applyAngularImpulse(impulse_factor)
        }
    } 
}

希望这有帮助!

答案 1 :(得分:0)

无论何时施加扭矩(如碰撞检测期间),如果将值保存在节点.userData中以供将来参考?

修改: 您是否需要应用相反的冲动,或者您可以通过将angularVelocity设置为零来停止旋转?或者可能通过SKActions将其慢慢减少到零?

答案 2 :(得分:0)

在太空中没有阻力,因此如果对物体施加力,只要施加力,物体就会继续加速。类似地,你需要应用来停止你的物体的力需要具有一定的幅度并且在特定的时间内被施加以便停止你的物体,因为如果你只是连续地施加力,那么物体将开始从那里返回它来了。所以,你需要知道施加它的力和时间(几乎是瞬间),以便产生相等的力来消除它的效果。我不认为这是正确的方法。

你需要做的是确定移动物体的方向(我将其称为速度矢量,它由物体现在的位置及其前一帧的位置决定)和例如,模块1应用与该向量相对的力(如果您想要更早地减慢对象,则应用更大的力)。并继续施加该力,直到物体的速度(速度矢量)为零。如果你想要平稳地降低速度和更好的结果,随着时间的推移线性减小你的反力模块。

这是你需要的吗?