如何向刚体添加扭矩直到 angular 速度为 0?
How to add torque to a rigidbody until it's angular velocity is 0?
我想弄清楚如何在 Unity 3D 中使用惯性停止刚体的旋转。这就是我认为应该完成的方式,但是当我 运行 它时,它使 Unity 崩溃,我不得不终止该进程。
while(rigidBody.angularVelocity.magnitude != 0) {
rigidBody.AddTorque(-transform.up * REACTION_WHEEL, ForceMode.Impulse);
}
那么我要如何为刚体增加扭矩以将其从任何 degrees/second 变为 0?
注意:我在查找不同的 ForceModes 之前写了这篇文章,但所有建议仍然有效。您的冻结是因为您要求的精度太高(您反复从速度中减去相同的量,而没有考虑越界(.5 -1 永远不会为 0)或方向(您的物体可能不会旋转 Transform.up)), 但我认为你真正想要的是:
您 运行 遇到的问题是扭矩与 angular 速度的关系就像加速度与正常速度的关系一样 - 您可以将加速度设置为数十亿,但这不会影响您的速度直到一段时间过去。如果你想停止你的对象这个框架,你真的只是想设置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
或您认为合适的任何值来增加对象的 angular 拖动。
我想弄清楚如何在 Unity 3D 中使用惯性停止刚体的旋转。这就是我认为应该完成的方式,但是当我 运行 它时,它使 Unity 崩溃,我不得不终止该进程。
while(rigidBody.angularVelocity.magnitude != 0) {
rigidBody.AddTorque(-transform.up * REACTION_WHEEL, ForceMode.Impulse);
}
那么我要如何为刚体增加扭矩以将其从任何 degrees/second 变为 0?
注意:我在查找不同的 ForceModes 之前写了这篇文章,但所有建议仍然有效。您的冻结是因为您要求的精度太高(您反复从速度中减去相同的量,而没有考虑越界(.5 -1 永远不会为 0)或方向(您的物体可能不会旋转 Transform.up)), 但我认为你真正想要的是:
您 运行 遇到的问题是扭矩与 angular 速度的关系就像加速度与正常速度的关系一样 - 您可以将加速度设置为数十亿,但这不会影响您的速度直到一段时间过去。如果你想停止你的对象这个框架,你真的只是想设置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
或您认为合适的任何值来增加对象的 angular 拖动。