2017-06-12 39 views
0

我将一个刚体连接到Unity中的HingeJoint。如何添加摩擦到Unity HingeJoint?

它附加在联合锚的中心没有。

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

不过,这并没有帮助,参考视频:

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

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

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

如何将摩擦应用于接头以阻止刚体移动?

设置有阻尼器的弹簧或施加极限不是我的选择,因为我需要在向电机施加足够的扭矩(力)时正确旋转刚体。
如果我将风门/限位开关切换,刚体沿着下降方向旋转时会移动得更快,而在相反方向旋转时刚体会更慢。

+0

所以你想在这个关节上有这么多的摩擦力,它不能掉下来。但你仍然可以运用另一种力量来移动它? – kiml42

+0

是的,我尝试模拟挖掘机手臂。 – Skyblade

+0

我想你会希望重心在胳膊上移动,随着时间的推移,质心向左移动。您可能需要关闭电机并编写您自己的脚本以将扭矩施加到关节上。理想情况下,你会使用一个PID控制器,但只是使力与距所需角度的距离成正比,并且段上的角度阻力应该会给你合理的结果。 – kiml42

回答

0

这听起来像你不想引力。你可以在刚体的检查员中关闭重力。

+0

不,我需要引力。 – Skyblade

+0

好吧,也许你需要澄清你的目标。你说你不希望它下降。 –

+0

是的,我不需要它掉下来,但是我想以恒定的速度向上和向下旋转。要做到这一点,我需要一些摩擦力。如果在移动时没有摩擦力,它会在下移时旋转得更快,当它上移时会慢。 – Skyblade

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); 
    } 
} 

这个回答你的问题的标题,而这也正是我一直在寻找的时候,我发现它。然而这可能不适合你想要从你的更详细的描述。

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