【问题标题】:Determine angular momentum from angular velocity for SKSpriteNode根据 SKSpriteNode 的角速度确定角动量
【发布时间】:2015-10-21 17:59:36
【问题描述】:

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

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

-physicsBody!.angularVelocity*physicsBody!.mass

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

【问题讨论】:

  • 我认为这可能与不考虑持续时间有关......虽然如果我使用 applyImpulse 也会遇到同样的问题
  • 当你想停止它时将节点的摩擦力设置为 1(以及它的质量非常重)然后在它停止时将其重置为 0 是否足够?跨度>
  • @Boby_Wan 不希望它影响其他交互。

标签: sprite-kit game-physics skphysicsbody


【解决方案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)
        }
    } 
}

希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

    编辑: 您是否需要施加相反的脉冲,或者您可以通过将angularVelocity 设置为零来停止旋转?或者可能通过 SKActions 将其缓慢降低到零?

    【讨论】:

      【解决方案3】:

      在太空中没有阻力,因此如果您对物体施加力,只要施加力,物体就会继续加速。同样,您需要施加以停止物体的力需要具有一定的大小并施加特定的时间才能停止您的物体,因为如果您只是连续施加力,那么物体将从哪里开始返回它来了。因此,您需要知道施加它的力和时间(几乎是立即),以便创建一个相等的力来取消其效果。我认为这不是正确的方法。

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

      这是你需要的吗?

      【讨论】:

        猜你喜欢
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多