private void StaticResponse(Collider dynamic, Collider stationary, Vector3 direction, float intersection, Vector3 contactPoint, bool initialResponse) { // Cache the rigidbody as we'll be using it a lot. var rigidbody = dynamic.attachedRigidbody; // Get the surface properties. var staticFriction = PhysicsMaterial.CalculateStaticFriction(dynamic.material, stationary.material); var kineticFriction = PhysicsMaterial.CalculateKineticFriction(dynamic.material, stationary.material); var restitution = PhysicsMaterial.CalculateRestitution(dynamic.material, stationary.material); if (initialResponse) { // Ensure the object is moved away. //StaticPositionCorrection (rigidbody, direction, intersection); // We assume the static object has a mass so great it can't be moved and just scale by restitution. var momentumDirection = Vector3.Reflect(rigidbody.momentum, direction); rigidbody.momentum = momentumDirection * restitution; // Now do the same for angular momentum. var angularDirection = Vector3.Reflect(rigidbody.angularMomentum, direction).normalized; rigidbody.angularMomentum = -angularDirection * restitution; } // Apply friction. ApplyFriction(rigidbody, staticFriction, kineticFriction, contactPoint); }
public static float CalculateRestitution(PhysicsMaterial lhs, PhysicsMaterial rhs) { if (lhs) { return(lhs.CalculateRestitution(rhs)); } if (rhs) { return(rhs.restitution); } return(1f); }
/// <summary> /// Combines the values of two surfaces together, outputting the results to Result a and b. /// </summary> /// <param name="lhs">A material to be combined.</param> /// <param name="rhs">A material to be combined./</param> /// <param name="a">The resulting surface properties for "lhs".</param> /// <param name="b">The resulting surface properties for "rhs".</param> public static void Combine(PhysicsMaterial lhs, PhysicsMaterial rhs, out Result a, out Result b) { if (lhs) { a.kineticFriction = lhs.CalculateKineticFriction(rhs); a.staticFriction = lhs.CalculateStaticFriction(rhs); a.restitution = lhs.CalculateRestitution(rhs); if (rhs) { b.kineticFriction = rhs.CalculateKineticFriction(lhs); b.staticFriction = rhs.CalculateStaticFriction(lhs); b.restitution = rhs.CalculateRestitution(lhs); } // Use the surface properties of "a" if "rhs" is null. else { b = a; } } // Swap the parameters if "lhs" is null and "rhs" isn't. else if (rhs) { Combine(rhs, lhs, out b, out a); } else { // Set restitution to 1.0 by default. a = new Result(); a.restitution = 1f; // Have "b" copy "a". b = a; } }