提问人:YaBoyShredderson 提问时间:11/8/2023 更新时间:11/8/2023 访问量:25
为什么我的定制车轮对撞机的物理速度和视觉速度不同?
Why are the physical and visual speeds of my custom wheel collider different?
问:
我正在尝试使用球体铸件在统一中制作我自己的自定义车轮碰撞器,但我在前向摩擦组件方面遇到了问题。车轮角速度几乎正好是应有的 6 倍。轮胎的行为应该像这样,但由于摩擦,车轮旋转得太快。因此,如果汽车在山坡上,并且从山坡上滚下来,摩擦力会使车轮以比应有的速度快 6 倍的速度。简单地将车轮速度除以 6 是行不通的,因为摩擦力急剧上升,汽车几乎无法移动。我对这种物理学不太熟悉,所以我真的不知道从哪里开始。
void ApplyForwardsFriction()
{
_wheelForwardSpeed = Vector3.Dot(_wheelVelocity, _wheelForwardDirection);
float rpm = _wheelAngularVelocity *(60 / (2 * Mathf.PI * _radius));
float slip = -Mathf.Sign(Vector3.Dot(_wheelForwardDirection, _wheelForwardDirection * _wheelForwardSpeed)) * (_wheelForwardDirection * _wheelForwardSpeed).magnitude + (rpm * Mathf.PI / 180.0f * _radius);
float slipRat = _wheelForwardSpeed == 0 ? 0 : (_wheelForwardSpeed - _wheelAngularVelocity) / _wheelForwardSpeed;
float frictionForce = slip * _forwardsTractionCoefficient * _forwardsTractionCurve.Evaluate(Mathf.Abs(slipRat)) * _suspensionForce;
_totalForce += _wheelForwardDirection * frictionForce;
float fricTorque = frictionForce * _radius;
float wheelAngularAccelRPS = fricTorque / _momentOfInertia;
float wheelAngularAccelMPS = wheelAngularAccelRPS * _radius;
_wheelAngularVelocity -= wheelAngularAccelMPS * Time.fixedDeltaTime;
//_wheelAngularVelocity /= 6;
float motorAccelRPS = _motorTorque / _momentOfInertia;
float motorAccelMPS = motorAccelRPS * _radius;
_wheelAngularVelocity += motorAccelMPS * Time.fixedDeltaTime;
}
_wheelForwardSpeed是轮胎的真实速度,忽略了侧向分量。_wheelAngularVelocity以米/秒为单位。
这些是轮胎的物理速度,而不是旋转的视觉网格,这是单独完成的。
我已将车轮视觉旋转的速度除以 6 以获得所需的视觉和物理行为,但这意味着_wheelAngularVelocity不正确。
void ApplyWheelPose()
{
if (!_handbrakeEnabled)
{
float radiansPerSecond = (_wheelAngularVelocity / _radius) / 6;
if (_leftWheel) _wheelEulers.x -= radiansPerSecond * Mathf.Rad2Deg * Time.deltaTime;
else _wheelEulers.x += radiansPerSecond * Mathf.Rad2Deg * Time.deltaTime;
}
_wheelEulers.y = _originalYRot + _steerAngle;
_mesh.transform.localRotation = Quaternion.Euler(_wheelEulers);
_mesh.transform.position = _wheelPosition;
}
有人让我知道我做错了什么?也许它一点也不错误,我把我的单位混合在一起,这样_wheelAngularVelocity不是每秒米?
_radius以米为单位,_wheelForwardSpeed以米/秒为单位。在 Update() 中调用 ApplyWheelPose(),在 FixedUpdate() 中调用 ApplyForwardsFriction()。谢谢。
答: 暂无答案
评论