为什么我的定制车轮对撞机的物理速度和视觉速度不同?

Why are the physical and visual speeds of my custom wheel collider different?

提问人:YaBoyShredderson 提问时间:11/8/2023 更新时间:11/8/2023 访问量:25

问:

我正在尝试使用球体铸件在统一中制作我自己的自定义车轮碰撞器,但我在前向摩擦组件方面遇到了问题。车轮角速度几乎正好是应有的 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()。谢谢。

C# unity-游戏引擎 物理 碰撞体 wheelcollider

评论


答: 暂无答案