Example #1
0
    public ForceAndTorque CalculateForces(VehiclePart part, float angle, Vector3 vehicleWorldVelocity, Vector3 vehicleWorldAngularVelocity)
    {
        Vector3 worldAC           = GetAdjustedWorldAerodynamicCenter(part);
        Vector3 relativePosition  = worldAC - part.Vehicle.Rb.worldCenterOfMass;
        Vector3 partWorldVelocity = RigidbodyExtensions.GetChildVelocity(part.Vehicle.Rb.worldCenterOfMass, vehicleWorldVelocity, vehicleWorldAngularVelocity, worldAC);

        if (part is IAerodynamicPart)
        {
            Vector3 tangentualWorldVelocity = partWorldVelocity - vehicleWorldVelocity;
            WorldTangentualVelocity = tangentualWorldVelocity;
        }

        Vector3 lift             = GetLiftVector(part, angle, partWorldVelocity);
        Vector3 drag             = GetDragVector(part, angle, partWorldVelocity);
        Vector3 aerodynamicForce = lift + drag;
        Vector3 torque           = Vector3.Cross(relativePosition, aerodynamicForce); // τ = r × F.

        return(new ForceAndTorque(aerodynamicForce, torque));
    }