570 lines
22 KiB
C#
570 lines
22 KiB
C#
using System;
|
||
|
||
namespace UnityEngine.AzureSky
|
||
{
|
||
[Serializable]
|
||
public class AzureSkyTimeOfDayComponent
|
||
{
|
||
//Used by Calendar.
|
||
public int selectableDayInt = 15;
|
||
public int dayOfYear = 1;
|
||
public string[] selectableDayList = new string[]
|
||
{
|
||
"0", "1", "2", "3", "4" , "5" , "6", "7" , "8", "9", "10",
|
||
"11", "12", "13", "14" , "15" , "16", "17" , "18", "19", "20",
|
||
"21", "22", "23", "24" , "25" , "26", "27" , "28", "29", "30",
|
||
"31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41"
|
||
};
|
||
|
||
//Used by Calendar and Time of Day tab.
|
||
public float hour = 6.0f;
|
||
public int day = 15;
|
||
public int month = 9;
|
||
public int year = 1903;
|
||
public int dayInMonth = 30;
|
||
public float utc = 0;
|
||
public float latitude = 0;
|
||
public float longitude = 0;
|
||
|
||
//Used by Time of Day tab.
|
||
public int timeMode = 0;
|
||
public float dayCycle = 10.0f;//In minutes
|
||
public bool setTimeByCurve = false;
|
||
public float hourByCurve = 6.0f;
|
||
public AnimationCurve dayCycleCurve = AnimationCurve.Linear(0, 0, 24, 24);
|
||
public float lst;
|
||
private float m_radians, m_radLatitude, m_sinLatitude, m_cosLatitude;
|
||
|
||
//Internal uses.
|
||
private Vector2 m_hourAndMinutes;
|
||
private Vector3 m_date;
|
||
private DateTime m_dateTime;
|
||
private int m_daysInMonth = 30;
|
||
private int m_dayOfWeek = 0;
|
||
private int m_fixLeapYear = 0;
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController and AzureSkyControllerEditor scripts to correctly adjusts the day buttons and day profiles on the calendar.
|
||
/// </summary>
|
||
/// <param name="dayList">List containing 42 strings with the day numbers to rename the calendar buttons.</param>
|
||
public void UpdateCalendar (string[] dayList)
|
||
{
|
||
m_daysInMonth = DateTime.DaysInMonth(year, month);
|
||
if (day > m_daysInMonth) { day = m_daysInMonth; }
|
||
if (day < 1) { day = 1; }
|
||
|
||
m_dateTime = new DateTime(year, month, 1);
|
||
m_dayOfWeek = (int)m_dateTime.DayOfWeek;
|
||
selectableDayInt = day - 1 + m_dayOfWeek;
|
||
|
||
m_dateTime = new DateTime(year, month, day);
|
||
for (int i = 0; i < dayList.Length; i++)
|
||
{
|
||
if (i < m_dayOfWeek || i >= (m_dayOfWeek + m_daysInMonth))
|
||
{
|
||
dayList[i] = "";
|
||
continue;
|
||
}
|
||
m_dateTime = new DateTime(year, month, (i - m_dayOfWeek) + 1);
|
||
dayList[i] = m_dateTime.Day.ToString();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Get the current day of the week and return an integer between 0 and 6.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public int GetDayOfWeek ()
|
||
{
|
||
m_dateTime = new DateTime(year, month, day);
|
||
return (int)m_dateTime.DayOfWeek;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyControllerEditor script to get the day of the week from a specific day of the month. Returns an integer between 0 and 6.
|
||
/// </summary>
|
||
/// <param name="dayNumber">Number of the day in the month.</param>
|
||
/// <returns></returns>
|
||
public int GetDayOfWeek (int dayNumber)
|
||
{
|
||
m_dateTime = new DateTime(year, month, dayNumber);
|
||
return (int)m_dateTime.DayOfWeek;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns the current day number of a 366-day year.
|
||
/// The return value is fix when it is not leap year, this method is ideal for accessing, adding, or removing day profiles from the calendar.
|
||
/// If you want to get the correct number for the day in the year, then use System.DateTime.DayOfYear instead.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public int GetDayOfYear ()
|
||
{
|
||
m_dateTime = new DateTime(year, month, day);
|
||
dayOfYear = m_dateTime.DayOfYear;
|
||
if ((dayOfYear > 59 && !IsLeapYear()))
|
||
{
|
||
m_fixLeapYear = 1;
|
||
}
|
||
else { m_fixLeapYear = 0; }
|
||
return m_dateTime.DayOfYear - 1 + m_fixLeapYear;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Return true if the current year is a leap year.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public bool IsLeapYear ()
|
||
{
|
||
return DateTime.IsLeapYear(year);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Converts the timeline in hours and minutes and returns as a Vector2(hours, minutes).
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public Vector2 GetTime ()
|
||
{
|
||
if (setTimeByCurve)
|
||
{
|
||
m_hourAndMinutes.x = Mathf.Floor(hourByCurve);
|
||
m_hourAndMinutes.y = 60.0f * (hourByCurve - m_hourAndMinutes.x);
|
||
m_hourAndMinutes.y = Mathf.Floor(m_hourAndMinutes.y);
|
||
}
|
||
else
|
||
{
|
||
m_hourAndMinutes.x = Mathf.Floor(hour);
|
||
m_hourAndMinutes.y = 60.0f * (hour - m_hourAndMinutes.x);
|
||
m_hourAndMinutes.y = Mathf.Floor(m_hourAndMinutes.y);
|
||
}
|
||
return m_hourAndMinutes;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Get the current date and returns as a Vector3(month, day, year)
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public Vector3 GetDate ()
|
||
{
|
||
m_date.x = month;
|
||
m_date.y = day;
|
||
m_date.z = year;
|
||
return m_date;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Get the current system time and returns as a Float.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public float GetSystemTime ()
|
||
{
|
||
return DateTime.Now.Hour + ((1.0f / 60.0f) * DateTime.Now.Minute);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController script to convert current system time into a float and apply to timeline.
|
||
/// </summary>
|
||
public void ApplySystemTime ()
|
||
{
|
||
hour = DateTime.Now.Hour + ((1.0f / 60.0f) * DateTime.Now.Minute);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController script to apply the current system date.
|
||
/// </summary>
|
||
public void ApplySystemDate ()
|
||
{
|
||
month = DateTime.Now.Month;
|
||
day = DateTime.Now.Day;
|
||
year = DateTime.Now.Year;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Starts the next day and resets the time based on the Repeat Mode set in the Inspector. This method is commonly called at midnight by AzureSkyController script.
|
||
/// </summary>
|
||
/// <param name="repeatMode">Place here the Repeat Mode setted on the Options tab.</param>
|
||
public void StartNextDay (int repeatMode)
|
||
{
|
||
if(repeatMode != 1)day += 1;
|
||
hour = 0;
|
||
if(day > m_daysInMonth)
|
||
{
|
||
day = 1;
|
||
if (repeatMode != 2)
|
||
{
|
||
month += 1;
|
||
if (month > 12)
|
||
{
|
||
month = 1;
|
||
if (repeatMode != 3)
|
||
{
|
||
year += 1;
|
||
if (year > 9999)
|
||
{
|
||
year = 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Skips to the next day and ignores the Repeat Mode set in the Inspector.
|
||
/// </summary>
|
||
/// <param name="keepTime">Keep the current time?</param>
|
||
public void JumpToNextDay ( bool keepTime = true)
|
||
{
|
||
day += 1;
|
||
if (!keepTime)
|
||
hour = 0;
|
||
if (day > m_daysInMonth)
|
||
{
|
||
day = 1;
|
||
month += 1;
|
||
if (month > 12)
|
||
{
|
||
month = 1;
|
||
year += 1;
|
||
if (year > 9999)
|
||
{
|
||
year = 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Go to a custom date.
|
||
/// </summary>
|
||
/// <param name="month">The number of the month you want to go.</param>
|
||
/// <param name="day">The number of the day you want to go.</param>
|
||
/// <param name="year">The number of the year you want to go.</param>
|
||
public void GotoDate (int month, int day, int year)
|
||
{
|
||
this.month = month;
|
||
this.day = day;
|
||
this.year = year;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Go to a custom time.
|
||
/// </summary>
|
||
/// <param name="hours">The number of the hour you want to go.</param>
|
||
/// <param name="minutes">The number of the minute you want to go.</param>
|
||
public void GotoTime (int hours, int minutes)
|
||
{
|
||
this.hour = hours + ((1.0f / 60.0f) * minutes);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController script to apply the time progression.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public float GetDayLength ()
|
||
{
|
||
if (dayCycle > 0.0f)
|
||
return (24.0f / 60.0f) / dayCycle;
|
||
else
|
||
return 0.0f;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController script to calculate the time of day based on the curve time.
|
||
/// </summary>
|
||
public void CalculateTimeByCurve ()
|
||
{
|
||
hourByCurve = dayCycleCurve.Evaluate(hour);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController script to set the simple sun position.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public float SetSimpleSunPosition ()
|
||
{
|
||
if (setTimeByCurve)
|
||
{
|
||
return ((hourByCurve + utc) * 360.0f / 24.0f) - 90.0f;
|
||
}
|
||
else
|
||
{
|
||
return ((hour + utc) * 360.0f / 24.0f) - 90.0f;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController script to set the simple moon position.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public Quaternion SetSimpleMoonPosition ( Transform sun)
|
||
{
|
||
return sun.transform.rotation * Quaternion.Euler(0, -180, 0);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController script to set the realistic sun position based on Time, Date and Location.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public Vector3 SetRealisticSunPosition ()
|
||
{
|
||
m_radians = (Mathf.PI * 2.0f) / 360.0f;//Used to convert degress to radians.
|
||
m_radLatitude = m_radians * latitude;
|
||
m_sinLatitude = Mathf.Sin(m_radLatitude);
|
||
m_cosLatitude = Mathf.Cos(m_radLatitude);
|
||
|
||
float hour = this.hour - utc;
|
||
//Time Scale.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//d = 367*y - 7 * ( y + (m+9)/12 ) / 4 + 275*m/9 + D - 730530
|
||
//d = d + UT/24.0
|
||
float d = 367 * year - 7 * (year + (month + 9) / 12) / 4 + 275 * month / 9 + day - 730530;
|
||
d = d + hour / 24.0f;
|
||
|
||
//Tilt of earth's axis.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//obliquity of the ecliptic.
|
||
float ecliptic = 23.4393f - 3.563E-7f * d;
|
||
//Need convert to radians before apply sine and cosine.
|
||
float radEcliptic = m_radians * ecliptic;
|
||
float sinEcliptic = Mathf.Sin(radEcliptic);
|
||
float cosEcliptic = Mathf.Cos(radEcliptic);
|
||
|
||
//Orbital elements of the Sun.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//float N = 0.0;
|
||
//float i = 0.0;
|
||
float w = 282.9404f + 4.70935E-5f * d;
|
||
//float a = 1.000000f;
|
||
float e = 0.016709f - 1.151E-9f * d;
|
||
float M = 356.0470f + 0.9856002585f * d;
|
||
|
||
//Eccentric anomaly.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//E = M + e*(180/pi) * sin(M) * ( 1.0 + e * cos(M) ) in degress.
|
||
//E = M + e * sin(M) * ( 1.0 + e * cos(M) ) in radians.
|
||
//Need convert to radians before apply sine and cosine.
|
||
float radM = m_radians * M;
|
||
float sinM = Mathf.Sin(radM);
|
||
float cosM = Mathf.Cos(radM);
|
||
|
||
//Need convert to radians before apply sine and cosine.
|
||
float radE = radM + e * sinM * (1.0f + e * cosM);
|
||
float sinE = Mathf.Sin(radE);
|
||
float cosE = Mathf.Cos(radE);
|
||
|
||
//Sun's distance (r) and its true anomaly (v).
|
||
//---------------------------------------------------------------------------------------------------
|
||
//Xv = r * cos (v) = cos (E) - e
|
||
//Yv = r * sen (v) = sqrt (1,0 - e * e) * sen (E)
|
||
float xv = cosE - e;
|
||
float yv = Mathf.Sqrt(1.0f - e * e) * sinE;
|
||
|
||
//V = atan2 (yv, xv)
|
||
//R = sqrt (xv * xv + yv * yv)
|
||
float v = Mathf.Rad2Deg * Mathf.Atan2(yv, xv);
|
||
float r = Mathf.Sqrt(xv * xv + yv * yv);
|
||
|
||
//Sun's true longitude.
|
||
//---------------------------------------------------------------------------------------------------
|
||
float radLongitude = m_radians * (v + w);
|
||
float sinLongitude = Mathf.Sin(radLongitude);
|
||
float cosLongitude = Mathf.Cos(radLongitude);
|
||
|
||
float xs = r * cosLongitude;
|
||
float ys = r * sinLongitude;
|
||
|
||
//Equatorial coordinates.
|
||
//---------------------------------------------------------------------------------------------------
|
||
float xe = xs;
|
||
float ye = ys * cosEcliptic;
|
||
float ze = ys * sinEcliptic;
|
||
|
||
//Sun's Right Ascension(RA) and Declination(Dec).
|
||
//---------------------------------------------------------------------------------------------------
|
||
float RA = Mathf.Atan2(ye, xe);
|
||
float Dec = Mathf.Atan2(ze, Mathf.Sqrt(xe * xe + ye * ye));
|
||
float sinDec = Mathf.Sin(Dec);
|
||
float cosDec = Mathf.Cos(Dec);
|
||
|
||
//The Sidereal Time.
|
||
//---------------------------------------------------------------------------------------------------
|
||
float Ls = v + w;
|
||
|
||
float GMST0 = Ls + 180.0f;
|
||
float UT = 15.0f * hour;//Universal Time.
|
||
float GMST = GMST0 + UT;
|
||
float LST = m_radians * (GMST + longitude);
|
||
|
||
//Store local sideral time.
|
||
lst = LST;
|
||
|
||
//Azimuthal coordinates.
|
||
//---------------------------------------------------------------------------------------------------
|
||
float HA = LST - RA;
|
||
float sinHA = Mathf.Sin(HA);
|
||
float cosHA = Mathf.Cos(HA);
|
||
|
||
float x = cosHA * cosDec;
|
||
float y = sinHA * cosDec;
|
||
float z = sinDec;
|
||
|
||
float xhor = x * m_sinLatitude - z * m_cosLatitude;
|
||
float yhor = y;
|
||
float zhor = x * m_cosLatitude + z * m_sinLatitude;
|
||
|
||
//az = atan2( yhor, xhor ) + 180_degrees
|
||
//alt = asin( zhor ) = atan2( zhor, sqrt(xhor*xhor+yhor*yhor) )
|
||
float azimuth = Mathf.Atan2(yhor, xhor) + m_radians * 180.0f;
|
||
float altitude = Mathf.Asin(zhor);
|
||
|
||
//Zenith angle.
|
||
//Zenith=90°−α Where α is the elevation angle.
|
||
float zenith = 90.0f * m_radians - altitude;
|
||
|
||
//Converts from Spherical(radius r, zenith-inclination θ, azimuth φ) to Cartesian(x,y,z) coordinates.
|
||
//https://en.wikipedia.org/wiki/Spherical_coordinate_system
|
||
//---------------------------------------------------------------------------------------------------
|
||
//x = r sin(θ)cos(φ)
|
||
//y = r sin(θ)sin(φ)
|
||
//z = r cos(θ)
|
||
Vector3 ret;
|
||
|
||
//radius = 1
|
||
ret.z = Mathf.Sin(zenith) * Mathf.Cos(azimuth);
|
||
ret.x = Mathf.Sin(zenith) * Mathf.Sin(azimuth);
|
||
ret.y = Mathf.Cos(zenith);
|
||
|
||
return ret * -1.0f;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Used by AzureSkyController script to set the realistic moon position based on Time, Date and Location.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public Vector3 SetRealisticMoonPosition ()
|
||
{
|
||
float hour = this.hour - utc;
|
||
|
||
//Time Scale.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//d = 367*y - 7 * ( y + (m+9)/12 ) / 4 + 275*m/9 + D - 730530
|
||
//d = d + UT/24.0
|
||
float d = 367 * year - 7 * (year + (month + 9) / 12) / 4 + 275 * month / 9 + day - 730530;
|
||
d = d + hour / 24.0f;
|
||
|
||
//Tilt of earth's axis.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//obliquity of the ecliptic.
|
||
float ecliptic = 23.4393f - 3.563E-7f * d;
|
||
//Need convert to radians before apply sine and cosine.
|
||
float radEcliptic = m_radians * ecliptic;
|
||
float sinEcliptic = Mathf.Sin(radEcliptic);
|
||
float cosEcliptic = Mathf.Cos(radEcliptic);
|
||
|
||
//Orbital elements of the Moon.
|
||
//---------------------------------------------------------------------------------------------------
|
||
float N = 125.1228f - 0.0529538083f * d;
|
||
float i = 5.1454f;
|
||
float w = 318.0634f + 0.1643573223f * d;
|
||
float a = 60.2666f;
|
||
float e = 0.054900f;
|
||
float M = 115.3654f + 13.0649929509f * d;
|
||
|
||
//Eccentric anomaly.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//E = M + e*(180/pi) * sin(M) * ( 1.0 + e * cos(M) )
|
||
float radM = m_radians * M;
|
||
float E = radM + e * Mathf.Sin(radM) * (1f + e * Mathf.Cos(radM));
|
||
|
||
//Planet's distance and true anomaly.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//xv = r * cos(v) = a * ( cos(E) - e )
|
||
//yv = r * sin(v) = a * ( sqrt(1.0 - e*e) * sin(E) )
|
||
float xv = a * (Mathf.Cos(E) - e);
|
||
float yv = a * (Mathf.Sqrt(1f - e * e) * Mathf.Sin(E));
|
||
//V = atan2 (yv, xv)
|
||
//R = sqrt (xv * xv + yv * yv)
|
||
float v = Mathf.Rad2Deg * Mathf.Atan2(yv, xv);
|
||
float r = Mathf.Sqrt(xv * xv + yv * yv);
|
||
|
||
//Moon position in 3D space.
|
||
//---------------------------------------------------------------------------------------------------
|
||
float radLongitude = m_radians * (v + w);
|
||
float sinLongitude = Mathf.Sin(radLongitude);
|
||
float cosLongitude = Mathf.Cos(radLongitude);
|
||
|
||
//Geocentric (Earth-centered) coordinates.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//xh = r * ( cos(N) * cos(v+w) - sin(N) * sin(v+w) * cos(i) )
|
||
//yh = r * ( sin(N) * cos(v+w) + cos(N) * sin(v+w) * cos(i) )
|
||
//zh = r * ( sin(v+w) * sin(i) )
|
||
float radN = m_radians * N;
|
||
float radI = m_radians * i;
|
||
|
||
float xh = r * (Mathf.Cos(radN) * cosLongitude - Mathf.Sin(radN) * sinLongitude * Mathf.Cos(radI));
|
||
float yh = r * (Mathf.Sin(radN) * cosLongitude + Mathf.Cos(radN) * sinLongitude * Mathf.Cos(radI));
|
||
float zh = r * (sinLongitude * Mathf.Sin(radI));
|
||
|
||
//float xg = xh; //No needed to the moon.
|
||
//float yg = yh;
|
||
//float zg = zh;
|
||
|
||
//Equatorial coordinates.
|
||
//---------------------------------------------------------------------------------------------------
|
||
float xe = xh;
|
||
float ye = yh * cosEcliptic - zh * sinEcliptic;
|
||
float ze = yh * sinEcliptic + zh * cosEcliptic;
|
||
|
||
//Planet's Right Ascension (RA) and Declination (Dec).
|
||
//---------------------------------------------------------------------------------------------------
|
||
float RA = Mathf.Atan2(ye, xe);
|
||
float Dec = Mathf.Atan2(ze, Mathf.Sqrt(xe * xe + ye * ye));
|
||
|
||
//The Sidereal Time.
|
||
//---------------------------------------------------------------------------------------------------
|
||
//It is already calculated for the sun and stored in the lst, it is not necessary to calculate again for the moon.
|
||
//float Ls = ls;
|
||
|
||
//float GMST0 = Ls + 180.0f;
|
||
//float UT = 15.0f * hour;
|
||
//float GMST = GMST0 + UT;
|
||
//float LST = radians * (GMST + Azure_Longitude);
|
||
|
||
//Azimuthal coordinates.
|
||
//---------------------------------------------------------------------------------------------------
|
||
float HA = lst - RA;
|
||
|
||
float x = Mathf.Cos(HA) * Mathf.Cos(Dec);
|
||
float y = Mathf.Sin(HA) * Mathf.Cos(Dec);
|
||
float z = Mathf.Sin(Dec);
|
||
|
||
float xhor = x * m_sinLatitude - z * m_cosLatitude;
|
||
float yhor = y;
|
||
float zhor = x * m_cosLatitude + z * m_sinLatitude;
|
||
|
||
//az = atan2( yhor, xhor ) + 180_degrees
|
||
//alt = asin( zhor ) = atan2( zhor, sqrt(xhor*xhor+yhor*yhor) )
|
||
float azimuth = Mathf.Atan2(yhor, xhor) + m_radians * 180.0f;
|
||
float altitude = Mathf.Asin(zhor);
|
||
|
||
//Zenith angle.
|
||
//Zenith = 90°−α where α is the elevation angle.
|
||
float zenith = 90.0f * m_radians - altitude;
|
||
|
||
//Converts from Spherical(radius r, zenith-inclination θ, azimuth φ) to Cartesian(x,y,z) coordinates.
|
||
//https://en.wikipedia.org/wiki/Spherical_coordinate_system
|
||
//---------------------------------------------------------------------------------------------------
|
||
//x = r sin(θ)cos(φ)
|
||
//y = r sin(θ)sin(φ)
|
||
//z = r cos(θ)
|
||
Vector3 ret;
|
||
|
||
//radius = 1
|
||
ret.z = Mathf.Sin(zenith) * Mathf.Cos(azimuth);
|
||
ret.x = Mathf.Sin(zenith) * Mathf.Sin(azimuth);
|
||
ret.y = Mathf.Cos(zenith);
|
||
|
||
return ret * -1.0f;
|
||
}
|
||
}
|
||
} |