Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 如何给铰链接头增加摩擦力?_Unity3d_Unity5_Game Physics_Physx - Fatal编程技术网

Unity3d 如何给铰链接头增加摩擦力?

Unity3d 如何给铰链接头增加摩擦力?,unity3d,unity5,game-physics,physx,Unity3d,Unity5,Game Physics,Physx,我把一个刚体和一个铰链连接在一起 它附着在接缝锚的中心 为了防止它坠落,我设置了使用Motor=true,Target Velocity=0,并对电机施加一些力 但是,这没有帮助,请参见视频: 以下是示例项目: 屏幕上重现的问题没有代码: 如何对关节施加摩擦力以阻止刚体移动 设置带减震器的弹簧或施加限制对我来说不是一个选项,因为当我向电机施加足够的扭矩时,我需要正确旋转刚体。 如果我打开和关闭减震器/限制,刚体在下降方向旋转时会移动得更快,在相反方向旋转时会移动得更慢。听起来好像你不想要重力。

我把一个刚体和一个铰链连接在一起

它附着在接缝锚的中心

为了防止它坠落,我设置了使用Motor=true,Target Velocity=0,并对电机施加一些力

但是,这没有帮助,请参见视频:

以下是示例项目:

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

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

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

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

我已经整理了一个在铰链关节上应用摩擦力的行为。这是:

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);
  }
}
这回答了你问题的标题,也是我找到它时一直在寻找的。然而,这可能无法满足您对更详细描述的需求


这会产生与角速度成比例的摩擦力,如果没有角速度,就不会产生力。这意味着在一个恒定的力下,比如你的例子中的重力,它总是以某种降低的速度移动。事实上,材料的缺陷和其他现实世界的混乱意味着对关节施加摩擦可以使关节保持恒定扭矩,但在游戏引擎中,你需要一些其他扭矩来抵消恒定的力。

不,我需要重力。好的,也许你需要澄清你的目标。你说过你不想让它掉下来。是的,我不想让它掉下来,但我想让它以恒定的速度上下旋转。要做到这一点,我需要一些摩擦力。如果我移动它时没有摩擦力,它向下移动时会旋转得更快,向上移动时会旋转得更慢。我知道重力会使刚体旋转,但电机会阻止。我仍然不清楚你想做什么,但是如果你想抵消重力,你可以计算重力作用在物体上的力矩,然后修改马达施加的力来抵消重力。但是这些计算并不容易,而且由于unity的物理特性,肯定不会精确。所以你想要在这个关节上有如此多的摩擦力,以至于它不会掉下来。但你仍然可以施加另一个力来移动它?是的,我试着模拟挖掘机的手臂。我想你会希望重心在手臂上移动,因为重心会随着它的延伸而移动。您可能需要关闭电机并编写自己的脚本,以便将扭矩应用于关节。理想情况下,您可以使用PID控制器,但只要使力与到所需角度的距离成比例,并且管段上的角度阻力应该会给您合理的结果。