2017-06-12 207 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); 
    } 
} 

這個回答你的問題的標題,而這也正是我一直在尋找的時候,我發現它。然而這可能不適合你想要從你的更詳細的描述。

這適用與角速度成比例的摩擦,如果沒有角速度,則不施加力。這意味着,在恆定的力量下,例如你的例子中的重力,它總是會以一定的速度移動。事實上,材料和其他現實世界混亂的不完美性意味着對關節施加摩擦可以使它們保持恆定的扭矩,但在遊戲引擎中,您需要一些其他扭矩來抵抗恆定的力量。

相關問題