Ejemplo n.º 1
0
            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);
            }
Ejemplo n.º 2
0
        public static float CalculateRestitution(PhysicsMaterial lhs, PhysicsMaterial rhs)
        {
            if (lhs)
            {
                return(lhs.CalculateRestitution(rhs));
            }

            if (rhs)
            {
                return(rhs.restitution);
            }

            return(1f);
        }
Ejemplo n.º 3
0
        /// <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;
            }
        }