LlGetSunDirection
De DigiWiki.
Phase | PST | PDT | GMT |
---|---|---|---|
Sunset | 2:30 AM | 3:30 AM | 10:30 |
Midnight | 3:00 AM | 4:00 AM | 11:00 |
Sunrise | 3:30 AM | 4:30 AM | 11:30 |
Sunset | 6:30 AM | 7:30 AM | 14:30 |
Midnight | 7:00 AM | 8:00 AM | 15:00 |
Sunrise | 7:30 AM | 8:30 AM | 15:30 |
Sunset | 10:30 AM | 11:30 AM | 18:30 |
Midnight | 11:00 AM | 12:00 PM | 19:00 |
Sunrise | 11:30 AM | 12:30 PM | 19:30 |
Sunset | 2:30 PM | 3:30 PM | 22:30 |
Midnight | 3:00 PM | 4:00 PM | 23:00 |
Sunrise | 3:30 PM | 4:30 PM | 23:30 |
Sunset | 6:30 PM | 7:30 PM | 2:30 |
Midnight | 7:00 PM | 8:00 PM | 3:00 |
Sunrise | 7:30 PM | 8:30 PM | 3:30 |
Sunset | 10:30 PM | 11:30 PM | 6:30 |
Midnight | 11:00 PM | 12:00 AM | 7:00 |
Sunrise | 11:30 PM | 12:30 AM | 7:30 |
One possible application for this function is to determine whether it's day- or nighttime. The following script simply uses the z-axis of the sun's vector to find out if the sun is above or below the horizon:
integer night=0; // 0 = daytime, 1 = nighttime default { state_entry() { llSetTimerEvent(300); // Check every 5 minutes } timer() { vector sun = llGetSunDirection(); if (sun.z <= 0) night = 1; // Sun is below the horizon else if (sun.z > 0) night = 0; // Sun is above the horizon } touch_start(integer total_number) { if (night == 1) llSay(0, "It's nighttime."); else if (night == 0) llSay(0, "It's daytime."); } }
If the complete script is to behave different at night, an additional script state may be a better solution than checking a variable:
default // daytime state { state_entry() { llSetTimerEvent(180); // Check every 3 minutes } timer() { vector sun = llGetSunDirection(); if (sun.z < 0) state night; } touch_start(integer total_number) { llSay(0, "It's daytime."); } } state night { state_entry() { llSetTimerEvent(180); // Check every 3 minutes } timer() { vector sun = llGetSunDirection(); if (sun.z > 0) state default; // Change back to daytime state } touch_start(integer total_number) { llSay(0, "It's nighttime."); } }
Rotating the object to follow the path of the sun during day time and return to a default position at night:
vector sun; default { state_entry() { llSetTimerEvent(300); // Check every 5 minutes } timer() { vector sun = llGetSunDirection(); if (sun.z <= 0) { // If it is night, return to default position llSetRot( <0, 0, 0, 0> ); } else if (sun.z > 0) { rotation sunRot = ZERO_ROTATION; // Set the rotation to NULL if (sun.z >= 0.0) { // If it is day, set rotation towards the sun sunRot = llAxes2Rot(<sun.x, sun.y, 0.0>, <-sun.y, sun.x, 0.0>, <0.0, 0.0, 1.0>); } llSetRot(sunRot); } } }
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.
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 ]); } }