【问题标题】:How to add friction to Unity HingeJoint?如何为 Unity HingeJoint 添加摩擦力?
【发布时间】:2017-06-12 10:47:44
【问题描述】:

我在 Unity 中将刚体附加到铰链关节。

它没有连接在关节锚的中心。

为了防止它下落,我设置了Use Motor = trueTarget Velocity = 0 并对电机施加了一些力。

但是,这无济于事,请参阅视频:

http://g.recordit.co/JJ0cmfT1Mb.gif

这里是示例项目:https://drive.google.com/open?id=0B8QGeF3SuAgTNnozX05wTVJGZHc

重现问题的屏幕(没有代码):

如何对关节施加摩擦力以阻止刚体移动?

用阻尼器设置弹簧或施加限制对我来说不是一个选项,因为当我向电机施加足够的扭矩(力)时,我需要正确旋转刚体。
如果我打开和关闭阻尼/限制,刚体在下降方向旋转时移动得更快,而在相反方向旋转时移动得更慢。

【问题讨论】:

  • 所以你想在这个关节上产生如此大的摩擦力,以至于它不会掉下来。但你仍然可以用另一个力来移动它?
  • 是的,我尝试模拟挖掘机臂。
  • 我想你会希望手臂上的重力在它伸展时移动重心。您可能想要关闭电机并编写自己的脚本以将扭矩应用于关节。理想情况下,您会使用 PID 控制器,但只需让力与与所需角度的距离成正比,并且段上的角度阻力应该会给您合理的结果。

标签: unity3d unity5 game-physics physx


【解决方案1】:

我整理了一个在铰链关节上施加摩擦的行为。这里是:

using UnityEngine;

public class JointFriction : MonoBehaviour {

  [Tooltip("mulitiplier for the angular velocity for the torque to apply.")]
  public float Friction = 0.4f;

  private HingeJoint _hinge;
  private Rigidbody _thisBody;
  private Rigidbody _connectedBody;
  private Vector3 _axis;  //local space

  // Use this for initialization
  void Start () {
    _hinge = GetComponent<HingeJoint>();
    _connectedBody = _hinge.connectedBody;
    _axis = _hinge.axis;

    _thisBody = GetComponent<Rigidbody>();
  }

  // Update is called once per frame
  void FixedUpdate () {
    var angularV = _hinge.velocity;
    //Debug.Log("angularV " + angularV);
    var worldAxis = transform.TransformVector(_axis);
    var worldTorque = Friction * angularV * worldAxis;

    _thisBody.AddTorque(-worldTorque);
    _connectedBody.AddTorque(worldTorque);
  }
}

这回答了您问题的标题,也是我找到它时所寻找的。但是,这可能不适用于您想要从更详细的描述中获得的内容。

这会施加与角速度成正比的摩擦力,如果没有角速度,则不会施加力。这意味着在恒定的力下,例如您的示例中的重力,它将始终以降低的速度移动。实际上,材料的缺陷和其他现实世界的混乱意味着对关节施加摩擦可以使它们在恒定扭矩下保持静止,但在游戏引擎中,您将需要一些其他扭矩来对抗恒定力。

【讨论】:

    【解决方案2】:

    听起来你不想要重力。您可以在刚体的检查器中关闭重力。

    【讨论】:

    • 不,我需要重力。
    • 好吧,也许你需要澄清你的目标。你说过你不想让它掉下来。
    • 是的,我不需要它掉下来,但我想以恒定的速度上下旋转它。为此,我需要一些摩擦力。如果我移动它时没有摩擦力,它向下移动时会旋转得更快,向上移动时会更慢。
    • 我知道重力会试图旋转刚体,但电机应该会阻止它。
    • 嗯,我仍然不清楚你要做什么,但如果你想抵消重力,你可以计算重力作用在你的物体上的扭矩,然后修改由电机完全抵消重力。但这些计算并不容易,而且由于统一处理物理的方式,肯定不会完全准确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多