From Second Life Wiki
Jump to: navigation, search


Function: vector llGetSunDirection( );

Returns a vector that is a normalized vector of the direction of the sun in the region.

The sun position can be dynamic or static depending upon the wishes of the sim owner.


Important Issues

~ All Issues ~ Search JIRA for related Bugs
   llGetSunDirection not accurate


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
    vector sun = llGetSunDirection();
    integer turnLightsOn = (sun.z < 0);
    if(turnLightsOn != lightsOn)
        lightsOn = turnLightsOn;
        llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]);

This is a simple script to detect if its day or not.

//Added by To-mos Codewarrior(tomos.halsey)
        vector sun=llGetSunDirection();
        integer day=llRound(sun.z);
        llSetText("Sun Pos: "+(string)sun+"Day: "+(string)day,<1.0,1.0,1.0>,1.0);
        llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES,  !day]);
This script may have some inaccuracy to it. For more information see the Deep Notes below.


AVERAGE_SUN_TILT = -.25 * pi

This is how mSunOffset is calculated:

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;
       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 / |R|
   ang_velocityp *= 1.0f / R;

Source: Zyzzy Zarf

See Also


•  llGetTimeOfDay

Deep Notes

All Issues

~ Search JIRA for related Issues
   llGetSunDirection not accurate


•  Visual illustration How good is this function?


function vector llGetSunDirection();