LlGetSunDirection/fr

From Second Life Wiki
Jump to: navigation, search

Description

Fonction: vector llGetSunDirection( );

Renvoie un vector correspondant à la direction du soleil dans la région.

La position du soleil peut être statique ou dynamique selon le règlage du propriétaire de la sim.

Exemples

Cet exemple peut être utilisé pour déterminer s'il fait jour ou nuit dans la sim (dans l'univers SL) et allumer une lumière si nécessaire : si la valeur Z du vector renvoyé est négative, alors le soleil est sous l'axe de l'horizon.

<lsl>integer lightsOn = -1;//ni TRUE ni 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

voici comment mSunOffset est calculé : <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;

//Calcul de la direction du soleil :

void LLRegion::calculateSunInfo(

      U64 current_time,
      LLVector3& directionp,
      LLVector3& ang_velocityp,
      F32& sun_phase)

{

  U64 local_time = current_time;
  if(getSunFixed())
  {
      local_time = 0;
  }
    // Le déplacement du soleil sur une journée est réalisé suivant un plan incliné .
    // L'inclinaison du plan varie légèrement au cours de l'année
    // F64 est utilisé pour éviter les erreurs d'arrondi
  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);
    // Déplace le soleil selon un plan
  directionp.setVec((F32)cos(-daily_phase), (F32)sin(-daily_phase), 0.0f);
    //incline le plan sur l'axe X (vers l'est)
  directionp.rotVec(tilt, 1.0f, 0.0f, 0.0f);
    // Calcule la vitesse angulaire (radians par second)
  ang_velocityp.setVec(0.0f, 0.0f, (F32)DAILY_OMEGA);
  ang_velocityp.rotVec((F32)tilt, 1.0f, 0.0f, 0.0f);
    // James voulait que la nuit soit plus courte que le jour.
    // On peut réaliser ce paramétrage en décalant le centre de l'orbite du soleil (sens positif selon l'axe Z) et en normalisant le nouveau vector
  directionp.mV[VZ] += SUN_NORMALIZED_OFFSET;
  F32 R = directionp.normVec();
    // Nous devons aussi corriger la vitesse angulaire
    //
    // V = W % R
    // V a une magnitude constante
    // Si R augmente, W diminue
    // W et R sont toujours perpendiculaires
    // ===>
    // W *= 1 /

Voir également

Fonctions

•  llGetTimeOfDay Renvoie l'heure
Vous cherchez encore des informations ? Peut-être cette page du LSLwiki pourra vous renseigner.