LlGetSunDirection/de

From Second Life Wiki
< LlGetSunDirection
Revision as of 11:38, 23 November 2008 by Zai Lynch (talk | contribs) (l10n (except note code))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Beschreibung

Funktion: vector llGetSunDirection( );

gibt die Sonnenrichtung in der Region.

Die Sonnenposition kann - abhängig von den Wünschen des Simbesitzers - dynamisch oder statisch sein.

Beispiele

Dies kann genutzt werden um schnell zu bestimmen ob Tag oder Nacht ist (in gekürzten SL Tagen). Wenn der zurückgegebene Z Parameter des Vektors positiv ist, steht die Sonne über dem Horizont (Tag) ansonsten unter dem Horizont (Nacht).

<lsl>integer lightsOn = -1;//nicht TRUE oder FALSE

CheckSun() {

   vector sun = llGetSunDirection();
   integer turnLightsOn = (sun.z < 0);
   if(turnLightsOn != lightsOn)
   {
       lightsOn = turnLightsOn;
       llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]);
   }
}</lsl>

Notizen

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

So wird mSunOffset berechnet: <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;

//Und hier steht wie die Sonnenrichtung berechnet wird:

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 /

Siehe auch

Funktionen

•  llGetTimeOfDay

Weiterführende Anmerkungen

Nach JIRA-Issues suchen, die sich hierauf beziehen

Signature

function vector llGetSunDirection();
Dieser Artikel war nicht hilfreich für Dich? Vielleicht bringt der zugehörige Artikel im SLinfo Wiki Erleuchtung.
<lsl></lsl>