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); }
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 } }
//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)); }
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); }
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; }
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!"); } }
//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); } }