ヒンジジョイントに摩擦を加える動作をまとめました。ここでは、次のとおりです。
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);
}
}
は、これはあなたの質問の見出しに応答し、私はそれを見つけたとき、私が探していたものです。しかし、これはおそらくあなたの詳細な説明からあなたが望むものに対してはうまくいかないでしょう。
これは角速度に比例する摩擦を適用します。角速度がない場合、力は加えられません。つまり、あなたの例では重力のような一定の力の下では、常に一定の速度で移動します。実際には、材料の不完全性や現実世界の厄介さは、関節に摩擦を加えると一定のトルクに耐えることができますが、ゲームエンジンでは、一定の力に対抗するためには他のトルクが必要になります。
だから、この関節にはあまりにも摩擦がかかるので、落ちないようにしてください。あなたはそれを動かすためにまだ別の力を加えることができますか? – kiml42
はい、私は掘削機の腕をシミュレートしようとします。 – Skyblade
私は、重心が腕の上に重力を持ち、それが伸びるにつれて動くようにしたいと思うでしょう。モーターをオフにし、トルクをジョイントに適用する独自のスクリプトを作成することができます。理想的には、PIDコントローラを使用しますが、力を所望の角度からの距離に比例させるだけで、セグメント上の角度ドラッグは合理的な結果をもたらすはずです。 – kiml42