【问题标题】:How to add torque to a rigidbody until it's angular velocity is 0?如何向刚体添加扭矩直到其角速度为0?
【发布时间】:2015-03-08 04:07:01
【问题描述】:

我试图弄清楚如何在 Unity 3D 中使用惯性来停止刚体的旋转。这就是我认为应该完成的方式,但是当我运行它时,它使 Unity 崩溃了,我不得不终止该进程。

        while(rigidBody.angularVelocity.magnitude != 0) {
            rigidBody.AddTorque(-transform.up * REACTION_WHEEL, ForceMode.Impulse);
        }

那么我将如何向刚体添加扭矩以使其从任意度/秒变为 0?

【问题讨论】:

  • 您确定增加扭矩最终会导致幅度为 0 吗?更有可能它永远不会完全为 0,并且 operator != 每次都会失败。
  • 你应该添加一个阻尼力。即,添加与当前旋转速度的负数成比例的扭矩。这将导致它沿着指数曲线减速。另外,就像 Frederik.L 所说的,检查一个非常小的震级而不是 0。
  • “添加与当前旋转速度的负数成正比的扭矩”是什么意思,你能举个例子吗?

标签: unity3d game-physics


【解决方案1】:

注意:我在查找不同的 ForceMode 之前写了这篇文章,但所有建议仍然有效。您的冻结是因为您要求的精度太高(您重复地从速度中减去相同的量,没有考虑过步(.5 -1 永远不是 0)或方向(您的对象可能没有围绕 Transform. up)),但我认为你真正想要的如下:

您遇到的问题是扭矩与角速度之比,就像加速度与正常速度之比一样 - 您可以将加速度设置为数十亿,但这不会影响您的速度,直到经过一段时间。如果你想停止你的对象这个帧,你真的只想设置rigidBody.angularVelocity = Vector3.zero;。如果您想随着时间的推移减慢对象的速度,那么 AddTorque 就是您要寻找的,但您只想每帧执行一次。

如果您想让某些东西像摩擦一样减速,那么每帧的恒定扭矩就是目标,例如

float SlowDownPerSecond = 2f;
//...each frame:
if(rigidBody.angularVelocity.maginitude > SlowDownPerSecond * Time.deltaTime){
    rigidBody.AddTorque(-rigidBody.angularVelocity.normalized * SlowDownPerSecond, ForceMode.Force);
} else {//less than change per frame
    rigidBody.angularVelocity = Vector3.zero;
}

但是你可能不太关心速度是否完全为零,而不是让它平稳减速,在这种情况下你可以这样做

rigidBody.AddTorque(rigidBody.angularVelocity * -.05f, ForceMode.Force);
//or
rigidBody.AddTorque(rigidBody.angularVelocity * -.05f * Time.deltaTime, ForceMode.Impulse);

每一帧。尽管如果这是您要查找的内容,我认为您可以在编辑器中或在运行时使用 rigidbody.angularDrag = .1f 或您认为合适的任何值来增加对象的角度拖动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多