我已经把一个在铰链接头上施加摩擦的行为放在一起。那就是:
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