如何为Unity HingeJoint添加摩擦力?

时间:2017-06-12 10:47:44

标签: unity3d unity5 game-physics physx

我将一个刚体附加到Unity中的HingeJoint。

它没有在一个关节锚的中心附着。

要阻止它掉落,我设置Use Motor = trueTarget Velocity = 0并对电机施加一些力。

但是,这没有用,请参阅视频:

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

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

重现问题的屏幕(没有代码): enter image description here

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

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

2 个答案:

答案 0 :(得分: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);
  }
}

这回答了你问题的标题,也是我找到它时所寻找的。但是,根据您的详细说明,这可能无法满足您的需求。

这适用于与角速度成比例的摩擦,如果没有角速度,则不施加力。这意味着在一个恒定的力量下,就像你的例子中的重力一样,它总会以一定的速度移动。实际上,材料的缺陷和其他现实世界的混乱意味着对关节施加摩擦可以使它们保持恒定的扭矩,但在游戏引擎中,你需要一些其他的扭矩来抵抗你的恒定力。

答案 1 :(得分:0)

听起来你不想要引力。你可以在僵硬的身体检查员身上关掉重力。