Exemple #1
0
        public bool UpdateSuspensionContacts(float dt, float updatePeriod)
        {
            this.numContacts            = 0;
            this.averageSurfaceVelocity = Vector3.zero;
            this.averageVelocity        = Vector3.zero;
            bool flag = true;

            for (int i = 0; i < this.rays.Length; i++)
            {
                SuspensionRay ray = this.rays[i];
                ray.Update(dt, updatePeriod);
                flag &= ray.hasCollision;
                if (ray.hasCollision)
                {
                    this.numContacts++;
                    this.averageSurfaceVelocity += ray.surfaceVelocity;
                    this.averageVelocity        += ray.velocity;
                }
            }
            if (!flag && (updatePeriod > 0f))
            {
                for (int j = 0; j < this.rays.Length; j++)
                {
                    this.rays[j].ResetContinuousRaycast();
                }
            }
            if (this.numContacts > 1)
            {
                this.averageSurfaceVelocity /= (float)this.numContacts;
                this.averageVelocity        /= (float)this.numContacts;
            }
            return(flag);
        }
Exemple #2
0
 private void ApplyTrackRayNormal(ref Vector3 currentNrm, SuspensionRay ray)
 {
     if (ray.hasCollision)
     {
         currentNrm += ray.rayHit.normal;
     }
 }
Exemple #3
0
 private void AddSurfaceVelocitiesFromRay(ChassisNode node, SuspensionRay ray, Vector3 contactsMidpoint, ref Vector3 surfaceVelocity, ref Vector3 angularSurfaceVelocity)
 {
     if (ray.hasCollision)
     {
         surfaceVelocity += ray.surfaceVelocity;
         Vector3 lhs          = ray.rayHit.point - contactsMidpoint;
         float   sqrMagnitude = lhs.sqrMagnitude;
         if (sqrMagnitude > 0.0001f)
         {
             angularSurfaceVelocity += Vector3.Cross(lhs, ray.surfaceVelocity) / sqrMagnitude;
         }
     }
 }
Exemple #4
0
 private void ApplyForceFromRay(SuspensionRay ray, Rigidbody rigidbody, Vector3 bodyForwardAxis, float forcePerRay)
 {
     if (ray.hasCollision)
     {
         float num = Mathf.Abs(Mathf.Acos(ray.rayHit.normal.normalized.y));
         if (num < 1.047198f)
         {
             float num2 = forcePerRay;
             if (num > 1.047198f)
             {
                 num2 *= (1.047198f - num) / 0.2617994f;
             }
             Vector3 force = bodyForwardAxis * num2;
             rigidbody.AddForceAtPositionSafe(force, ray.GetGlobalOrigin());
         }
     }
 }
Exemple #5
0
        private Vector3 GetContactsMidpoint(ChassisConfigComponent chassisConfig, TrackComponent tracks)
        {
            Vector3 vector = new Vector3();

            for (int i = 0; i < chassisConfig.NumRaysPerTrack; i++)
            {
                SuspensionRay ray = tracks.LeftTrack.rays[i];
                if (ray.hasCollision)
                {
                    vector += ray.rayHit.point;
                }
                ray = tracks.RightTrack.rays[i];
                if (ray.hasCollision)
                {
                    vector += ray.rayHit.point;
                }
            }
            int num2 = tracks.LeftTrack.numContacts + tracks.RightTrack.numContacts;

            return((num2 != 0) ? (vector / ((float)num2)) : Vector3.zero);
        }
Exemple #6
0
        private Vector3 GetFallingNrm(bool fallingByTrack, TrackComponent track, ChassisConfigComponent chassisConfig, TankCollisionComponent tankCollision, out bool isFallingOnTank)
        {
            Vector3 zero = Vector3.zero;

            isFallingOnTank = false;
            if (!fallingByTrack)
            {
                Collision collision = tankCollision.Collision;
                if (!this.CheckTankCollisionNotNull(tankCollision))
                {
                    return(zero.normalized);
                }
                ContactPoint[] contacts = collision.contacts;
                if (contacts == null)
                {
                    return(zero.normalized);
                }
                int length = contacts.Length;
                for (int i = 0; i < length; i++)
                {
                    ContactPoint point = contacts[i];
                    zero += point.normal;
                    if (!isFallingOnTank)
                    {
                        Collider otherCollider = point.otherCollider;
                        if (this.ValidateCollider(otherCollider))
                        {
                            int layer = otherCollider.gameObject.layer;
                            isFallingOnTank |= this.CheckTankLayer(layer);
                        }
                    }
                }
            }
            else
            {
                int             numRaysPerTrack = chassisConfig.NumRaysPerTrack;
                SuspensionRay[] rays            = track.LeftTrack.rays;
                SuspensionRay[] rayArray2       = track.RightTrack.rays;
                for (int i = 0; i < numRaysPerTrack; i++)
                {
                    SuspensionRay ray  = rays[i];
                    SuspensionRay ray2 = rayArray2[i];
                    this.ApplyTrackRayNormal(ref zero, ray);
                    this.ApplyTrackRayNormal(ref zero, ray2);
                    if (!isFallingOnTank)
                    {
                        if (ray.hasCollision)
                        {
                            if ((ray.rayHit.collider == null) || (ray.rayHit.collider.gameObject == null))
                            {
                                return(zero.normalized);
                            }
                            if (this.ValidateCollider(ray.rayHit.collider))
                            {
                                int layer = ray.rayHit.collider.gameObject.layer;
                                isFallingOnTank |= this.CheckTankLayer(layer);
                            }
                        }
                        if (ray2.hasCollision)
                        {
                            if ((ray2.rayHit.collider == null) || (ray2.rayHit.collider.gameObject == null))
                            {
                                return(zero.normalized);
                            }
                            if (this.ValidateCollider(ray2.rayHit.collider))
                            {
                                int layer = ray2.rayHit.collider.gameObject.layer;
                                isFallingOnTank |= this.CheckTankLayer(layer);
                            }
                        }
                    }
                }
            }
            return(zero.normalized);
        }