Esempio n. 1
0
        protected virtual void CalculateUp()
        {
            //Get the nearest gravitational field and use this as our primary sourse of data
            GameObject fieldTmp = GeoCoord.NearestGravitationalBody(transform.position);
            if (fieldTmp != nearestGravityField && fieldTmp !=null) {
                nearestGravityField = fieldTmp;
                gb = nearestGravityField.GetComponent<GravitationalBody>();
            }

            if (gb) {
                gravityUp = gb.GravityUp(transform);

                //Also collect right and forward while we are here
                gravityRight = Vector3.Cross(rb.velocity.normalized, gravityUp);
                gravityForward = -Vector3.Cross(gravityUp, gravityRight);
            }
            

            //TODO: MOVE TO METHOD SO WE DONT HAVE DUPLICATE CODE

            //DEEEEBUG because this is probably wrong
            //Debug.DrawRay(transform.position, gravityUp * 10f, Color.green);
            //Debug.DrawRay(transform.position, gravityRight * 10f, Color.red);
            //Debug.DrawRay(transform.position, gravityForward * 10f, Color.blue);
        }
Esempio n. 2
0
        protected virtual void HandleGravity()
        {
            //If we have a Physicsbody, borrow their calculation since we dont want to do it twice...
            if (pb)
            {
                gravityUp      = pb.GravityUp;
                gravityRight   = pb.GravityRight;
                gravityForward = pb.GravityForward;
            }
            else
            {
                //Get the nearest gravitational field and use this as our primary sourse of data
                GameObject fieldTmp = GeoCoord.NearestGravitationalBody(transform.position);
                if (fieldTmp != nearestGravityField)
                {
                    nearestGravityField = fieldTmp;
                    gb = nearestGravityField.GetComponent <GravitationalBody>();
                }

                gravityUp = gb.GravityUp(transform);

                //Also collect right and forward while we are here
                gravityRight   = Vector3.Cross(rb.velocity.normalized, gravityUp);
                gravityForward = Vector3.Cross(gravityUp, gravityRight);

                //TODO: MOVE TO METHOD SO WE DONT HAVE DUPLICATE CODE
            }
        }
Esempio n. 3
0
        //Converts a world coordiante into a lat/long value.
        public static LatLon GetLatLon(GravitationalBody planet, Vector3 position)
        {
            float lon      = (float)Mathf.Atan2(position.z, position.x); //phi
            float xzLength = new Vector2(position.x, position.z).magnitude;
            float lat      = (float)Mathf.Atan2(position.y, xzLength);   //phi

            return(new LatLon(planet, Mathf.Rad2Deg * lat, Mathf.Rad2Deg * lon));
        }
Esempio n. 4
0
        public static float GetHeightATL(GravitationalBody planet, Vector3 position, float offset = 0f)
        {
            LatLon geoPos           = GetLatLon(planet, position);
            float  terrainElevation = GetTerrainElevation(geoPos);
            float  height           = Vector3.Distance(position, geoPos.centre) - terrainElevation - geoPos.radius - offset;

            return(height);
        }
Esempio n. 5
0
 public LatLon(GravitationalBody body, float latitude, float longitude)
 {
     this.body   = body;
     this.lat    = latitude;
     this.lon    = longitude;
     this.radius = this.body.radius;
     this.centre = this.body.transform.position;
 }
Esempio n. 6
0
 public void SetPos(Vector3 pos)
 {
     planet = planetObj.GetComponent <GravitationalBody>();
     if (planet)
     {
         GeoCoord.SetPosATL(transform, new LatLon(planet, pos.x, pos.y), pos.z + (ObjectHeightOffset / 2));
         Debug.Log(transform.name + " placed at (" + pos.x + "," + pos.y + ")");
     }
     else
     {
         Debug.LogWarning("No planet data provided!");
     }
 }
Esempio n. 7
0
        //Standard gravitational method 
        protected virtual void CalculateGravity()
        {
            gravityFields = GameObject.FindGameObjectsWithTag("GravitationalBody");
            Vector3 finalForce = Vector3.zero;

            if (hasGravity) {
                foreach (GameObject obj in gravityFields) {
                    GravitationalBody gb = obj.GetComponent<GravitationalBody>();
                    if (gb) {
                        finalForce += gb.GetGravitationalForce(transform.position, mass);
                    }
                }

                //Used for debuging. 
                gravityStrength = finalForce.magnitude;

                rb.AddForce(finalForce);
            }
        }