Difference between revisions of "LlGetSunDirection"
m (added example: positive Z = daylight.) |
m |
||
Line 10: | Line 10: | ||
|examples=This can be used to quickly determine whether it is day or night (in shortened SL days) as the script runs: if the returned vector's Z element is positive, then the sun is above the horizon. | |examples=This can be used to quickly determine whether it is day or night (in shortened SL days) as the script runs: if the returned vector's Z element is positive, then the sun is above the horizon. | ||
< | <lsl>integer lightsOn = -1;//not TRUE or FALSE | ||
CheckSun() | |||
{ | |||
vector sun = llGetSunDirection(); | |||
integer turnLightsOn = (sun.z < 0); | |||
if(turnLightsOn != lightsOn) | |||
{ | |||
lightsOn = turnLightsOn; | |||
llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]); | llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]); | ||
</ | } | ||
}</lsl> | |||
|helpers | |helpers | ||
|also_functions= | |also_functions= | ||
Line 37: | Line 34: | ||
</pre> | </pre> | ||
This is how mSunOffset is calculated: | This is how mSunOffset is calculated: | ||
< | <cpp> | ||
F64 daily_phase = DAILY_OMEGA * U64_to_F64(local_time / USEC_PER_SEC); | F64 daily_phase = DAILY_OMEGA * U64_to_F64(local_time / USEC_PER_SEC); | ||
F32 sun_phase = (F32)fmod(daily_phase, 2.0*F_PI); | F32 sun_phase = (F32)fmod(daily_phase, 2.0*F_PI); | ||
sun_hour -= 6. | sun_hour -= 6.0f; | ||
mSunOffset = HOURS_TO_RADIANS * sun_hour - (0.25f * F_PI) * cosf(HOURS_TO_RADIANS * sun_hour) - sun_phase; | mSunOffset = HOURS_TO_RADIANS * sun_hour - (0.25f * F_PI) * cosf(HOURS_TO_RADIANS * sun_hour) - sun_phase; | ||
Line 90: | Line 87: | ||
ang_velocityp *= 1.0f / R; | ang_velocityp *= 1.0f / R; | ||
} | } | ||
</ | </cpp> | ||
Source: [https://lists.secondlife.com/pipermail/secondlifescripters/2007-July/001288.html Zyzzy Zarf] | Source: [https://lists.secondlife.com/pipermail/secondlifescripters/2007-July/001288.html Zyzzy Zarf] | ||
|permission | |permission |
Revision as of 19:09, 2 December 2007
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Summary
Function: vector llGetSunDirection( );177 | Function ID |
0.0 | Forced Delay |
10.0 | Energy |
Returns a vector that is the direction of the sun in the region.
The sun position can be dynamic or static depending upon the wishes of the sim owner.
Caveats
Examples
This can be used to quickly determine whether it is day or night (in shortened SL days) as the script runs: if the returned vector's Z element is positive, then the sun is above the horizon.
<lsl>integer lightsOn = -1;//not TRUE or FALSE
CheckSun() {
vector sun = llGetSunDirection(); integer turnLightsOn = (sun.z < 0); if(turnLightsOn != lightsOn) { lightsOn = turnLightsOn; llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]); }}</lsl>
Notes
AVERAGE_SUN_TILT = -.25 * pi SEASONAL_SUN_TILT = .03 * pi SUN_NORMALIZED_OFFSET = .45
This is how mSunOffset is calculated: <cpp> F64 daily_phase = DAILY_OMEGA * U64_to_F64(local_time / USEC_PER_SEC); F32 sun_phase = (F32)fmod(daily_phase, 2.0*F_PI); sun_hour -= 6.0f; mSunOffset = HOURS_TO_RADIANS * sun_hour - (0.25f * F_PI) * cosf(HOURS_TO_RADIANS * sun_hour) - sun_phase;
And here's how sun direction is calculated:
void LLRegion::calculateSunInfo(
U64 current_time, LLVector3& directionp, LLVector3& ang_velocityp, F32& sun_phase)
{
U64 local_time = current_time; if(getSunFixed()) { local_time = 0; } // Sun moves (once a day) about a circle that lies on a tilted plane. // The angle of the plane cycles (once a year) a few radians about // some average. // These are F64's, otherwise we get rounding errors over time F64 daily_phase = DAILY_OMEGA * U64_to_F64(local_time / USEC_PER_SEC) + mSunOffset; F64 yearly_phase = YEARLY_OMEGA * U64_to_F64(local_time / USEC_PER_SEC); F32 tilt = AVERAGE_SUN_TILT + SEASONAL_SUN_TILT_AMPLITUDE * (F32)sin(yearly_phase);
sun_phase = (F32)fmod(daily_phase, 2.0*F_PI); // move sun around a circle directionp.setVec((F32)cos(-daily_phase), (F32)sin(-daily_phase), 0.0f); //tilt the circle about X-axis (due east) directionp.rotVec(tilt, 1.0f, 0.0f, 0.0f);
// calculate angular velocity (radians per second) ang_velocityp.setVec(0.0f, 0.0f, (F32)DAILY_OMEGA); ang_velocityp.rotVec((F32)tilt, 1.0f, 0.0f, 0.0f);
// James wanted the night to be shorter than the day. // We can do this by offsetting the center of the sun's orbit in the positive // z-direction and normalizing the new vector. directionp.mV[VZ] += SUN_NORMALIZED_OFFSET; F32 R = directionp.normVec();
// We also need to correct the angular velocity // // V = W % R // V has constant magnitude // As R goes up, W must go down // W and R are always perpendicular // ===> // W *= 1 /
See Also
Functions
• | llGetTimeOfDay |