Difference between revisions of "LlGetSunDirection"

From Second Life Wiki
Jump to navigation Jump to search
m (<lsl> and <cpp> tags to <source>)
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
<source lang="lsl2">integer lightsOn = -1;//not TRUE or FALSE


CheckSun()
CheckSun()
Line 21: Line 21:
         llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]);
         llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]);
     }
     }
}</lsl>
}</source>
This is a simple script to detect if its day or not.
This is a simple script to detect if its day or not.
<lsl>
<source lang="lsl2">
//Added by To-mos Codewarrior(tomos.halsey)
//Added by To-mos Codewarrior(tomos.halsey)
default
default
Line 37: Line 37:
         llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES,  !day]);
         llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES,  !day]);
     }
     }
}</lsl>
}</source>
This script may have some inaccuracy to it. For more information see the Deep Notes below.
This script may have some inaccuracy to it. For more information see the Deep Notes below.
|helpers
|helpers
Line 52: Line 52:
</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);
<source lang="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);
F32 sun_phase = (F32)fmod(daily_phase, 2.0*F_PI);
sun_hour -= 6.0f;
sun_hour -= 6.0f;
Line 103: Line 103:
     // W *= 1 / |R|
     // W *= 1 / |R|
   ang_velocityp *= 1.0f / R;
   ang_velocityp *= 1.0f / R;
}</cpp>
}</source>
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
Line 115: Line 115:
|cat5
|cat5
|cat6
|cat6
}}<div style="display:none;"><lsl></lsl></div>
}}<div style="display:none;"><source lang="lsl2"></source></div>

Revision as of 01:59, 22 January 2015

Summary

Function: vector llGetSunDirection( );
0.0 Forced Delay
10.0 Energy

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.

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.

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 ]);
    }
}

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

//Added by To-mos Codewarrior(tomos.halsey)
default
{
    state_entry()
    {llSetTimerEvent(1.0);}

    timer()
    {
        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.

Notes

AVERAGE_SUN_TILT = -.25 * pi
SEASONAL_SUN_TILT = .03 * pi
SUN_NORMALIZED_OFFSET = .45

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

Source: Zyzzy Zarf

See Also

Functions

•  llGetTimeOfDay

Deep Notes

Tests

•  Visual illustration How good is this function?

Signature

function vector llGetSunDirection();