[Aide] Reflets changeants de lumière

Répondre
Partager Rechercher
Bonjour,
Je souhaiterais obtenir un effet "reflets de lumière changeants", un peu comme lorsqu'on est à proximité de la lueur d'une bougie ou d'un feu de bois, en jouant sur des intensités, voire des couleurs (llSetPrimitiveParams([PRIM_POINT_LIGHT] ) "randoms".
J'envisageais indiquer en liste différentes valeurs d'intensité (et de couleurs) et qu'elles soient choisies aléatoirement (llFrand). J'ai essayé d'adapter ce script qu'on trouve sur le wiki LSL, mais en plus il ne marche pas (ou je ne sais pas le faire marcher):
Code PHP:

// Touch the object to light it up. 
// Lighting is configurable.   
integer light_s TRUE;
 
vector lightcolor = <1.00.750.5>;
 
float intensity 1.0// 0-1
 
float radius 10.0;   // 0-10
 
float falloff 0.0;   // 0-1 
float glow 1.0;  
 
switchit() {     float thisglow 0.0;   
  
light_s = !light_s;   
  if (
light_s)   
  {         
thisglow glow;     } 
    
llSetPrimitiveParams([         PRIM_POINT_LIGHTlight_slightcolorintensityradiusfalloff,         PRIM_FULLBRIGHTALL_SIDESlight_s,         PRIM_GLOWALL_SIDESthisglow     ]);       

llSetColor(lightcolorALL_SIDES); }
  
default 
{     
state_entry() 
    {       
llSetText("Touch for light",<0,0,0>,1);       switchit();     }
 
touch_start(integer total_number
    {         
switchit();     } } 
Bref, si une âme charitable pouvait m'aider, ce serait chou de sa part.

Dernière modification par Poisson.Soluble ; 16/08/2013 à 12h45.
Le script que tu avais cité fonctionne comme un interrupteur :
tu touches , cela active une lumière , tu retouches , cela l éteint , et ainsi de suite

A ce que je comprend , tu désires plutôt un changement de couleur à chaque toucher sur la prim :
Renseigne la liste listeLumieres ci dessous avec les paramètres désirés.

Éventuellement , si tu veux changer de lumière tant que l utilisateur reste avec le bouton de la souris appuyé , change le touch_end par touch

Code PHP:

integer lumiereActuelle = -1;

// notre liste de lumieres 
// A remplir ( que ce soit manuellement ou par notecard ou par flux HTTP ) 
// Dans notre script , une lumiere est definie par 5 champs 
// Champ 1 : vecteur représentant la  couleur de la lumiere , qui est reprise aussi pour la couleur de la prim
// Champ 2 : intensite
// Champ 3 : rayon
// Champ 4 : falloff
// Champ 5 : glow

list listeLumieres =
[
    <
1,1,1>, 1.010.00.750.2
    <
1,0,0>, 1.010.00.750.12,
    <
0,1,0>, 1.010.00.750.05,
    <
0,0,1>, 1.010.00.750.02
];
// dans l exemple ci dessus , on a 4 lumières successivement blanche , rouge , vert , bleu

// choisit une lumiere aleatoirement parmi notre liste de lumiere [ listeLumieres ] 
// Si la lumiere choisie est la meme que celle actuellement sur la prim , on en rechoisit une autre
choisirLumiere()
{
    
integer nombreLumieres llGetListLength(listeLumieres) / 5;
    
integer numeroLumiereAleatoire ;
    
    do 
    {
        
numeroLumiereAleatoire = (integer)llFrand((float)nombreLumieres );
    } while ( 
lumiereActuelle == numeroLumiereAleatoire ); 
    
lumiereActuelle numeroLumiereAleatoire
    
changeLumierellList2List(listeLumieresnumeroLumiereAleatoire numeroLumiereAleatoire 4) );
}

// test de validite des parametres  de la lumiere
// retourne vrai si le parametre [ valeur ] est compris entre le parametre [ min ] et [ max ]
// retourne faux avec un message au owner sinon
integer controlestring nom_du_champfloat valeur float min float max )
{
    if ( ( 
valeur min ) || ( valeur max ) )
    {
        
llOwnerSay("Le champ " nom_du_champ " a une valeur en dehors du domaine de valeurs autorisé : valeur " + (string)valeur  " domaine autorise " + (string)min " , " + (string) max );
        return 
FALSE;
    }
    return 
TRUE;
}

// En parametre : [ lumiere ] 
//  Verifie si les parametres pour la lumiere sont corrects
// Si ils sont corrects applique la lumiere sur la prim
changeLumiere(list lumiere)
{
    
vector couleur llList2Vector(lumiere0);
    
float intensite llList2Float(lumiere1); 
    
float rayon llList2Float(lumiere2); 
    
float falloff llList2Float(lumiere3); 
    
float glow llList2Float(lumiere4); 
    
    if ( 
        
controle"intensite"intensite 0.01.0) &&
        
controle"rayon"rayon 0.020.0) &&
        
controle"falloff"falloff 0.02.0) &&
        
controle"glow"glow 0.01.0)
    )
    {
        list 
parametresLumiere 
            [
                
PRIM_POINT_LIGHTTRUEcouleurintensiterayonfalloff
                
PRIM_FULLBRIGHTALL_SIDESTRUE,
                
PRIM_GLOWALL_SIDESglow,
                
PRIM_COLORALL_SIDEScouleur1.0
            
];
        
llSetLinkPrimitiveParamsFast LINK_THISparametresLumiere );
    }
             
}


  
default 
{     
state_entry() 
    {       
        
llSetText("Toucher pour changer de lumiere",<1,1,1>,1);
    }
    
touch_end(integer total_number
    {         
        
choisirLumiere()  ;
    } 


Dernière modification par redpurple ; 16/08/2013 à 16h31.
Bonjour Redpurple!
En fait, comme dans le script du wiki, le fait de toucher ne déclenche rien du tout. Ni même le floating texte!
En fait, le "toucher" m'intéresse peu. Ce serait plutôt un script à mettre dans la flamme d'une bougie ou d'un feu de bois par exemple et lorsqu'on approche son visage, on voit une lumière chatoyante reflétée sur le visage.
Si je joue manuellement avec l'intensité de la light dans features, j'y arrive à peu près, mais il faudrait que ce soit automatique.
Bonsoir, le script suivant, vraiment basique fait changer la lumière émise toutes les 5 secondes avec une couleur aléatoire allant du rouge au jaune, incluant toutes les nuances d' orange. Il faut se trouver à moins de 2 mètres pour en voir les effets....attention à d' autres lumières parasites aux alentours, l' observation est bien sur plus facile en mode minuit.
Code PHP:

default
{
    
state_entry()
    {
        
llSetTimerEvent(5.0);
    }
    
timer()
    {
      
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POINT_LIGHT,TRUE,
                                    <
1.0,llFrand(1.0),0.0>,  // couleur RVB   
                                    
1.0,            // intensité            (varie entre 0.0 et 1.0)
                                    
2.0,           // rayon                (varie entre 0.1 et 10.0)
                                    
0.5 ]);         // vitesse d'extinction (varie entre 0.01 et 1.0)
    
}

Je me suis un peu amusé à partir du script de Menthal avec une petite boule :

Code PHP:

default
{
    
state_entry()
    {
        
llSetTimerEvent(1.0);
    }
    
timer()
    {
        
vector color = <.7 llFrand(.3), .1 llFrand(.2), 0.0>;  // Couleur rougoyante
        
float intensite .6 llFrand(.4);
        
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POINT_LIGHT,TRUE,
            
color
            
intensite,            // intensité            (varie entre 0.0 et 1.0)
            
2.0,           // rayon                (varie entre 0.1 et 10.0)
            
llFrand(.1) + .01,  // vitesse d'extinction (varie entre 0.01 et 1.0)
            
PRIM_COLORALL_SIDEScolor.9,
            
PRIM_GLOWALL_SIDESintensite]);        
            
        
llSetTimerEvent(llFrand(1.0) + .2);
   }

Merci MentalOH!

Effectivement, cela marche. Je crois avoir égaré redpurple avec le script trouvé sur le wiki et cette histoire de liste, que je croyais nécessaire au fonctionnement de llFrand.

Pour un effet "reflets de feu de bois", il suffit d'accélérer le "timer" et de faire varier aléatoirement l'"intensité". D'augmenter le rayon peut-être. Un truc du genre:

Code PHP:

default
{
    
state_entry()
    {
        
llSetTimerEvent(0.01);
    }
    
timer()
    {
      
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POINT_LIGHT,TRUE,
                                     <
1.0,llFrand(1.0),0.0>,  // couleur RVB   
                                    
llFrand(1.0),            // intensité            (varie entre 0.0 et 1.0)
                                    
10.0,           // rayon                (varie entre 0.1 et 10.0)
                                    
0.01 ]);         // vitesse d'extinction (varie entre 0.01 et 1.0)
    
}

Questions: 1°) niveau lag, ce n'est pas trop mortel (à une époque on déconseillait les "light balls" censées améliorer le rendu de la skin)?

2°) si je ne veux faire varier l'"intensité" que dans l'écart de 0.5 à 1.0, par exemple (histoire de rendre le mouvement plus imperceptible), avec llFrand, comment formuler cela?

PS: entre temps, BestMomo s'est amusé avec le script de MentalOh. J'essaie.
Rere...il y a eventuellement un moyen pour se passer du timer....avec ce script....le changement se faisant tous les 2/10eme de sec...ce qui est déjà sympa visuellement, surtout avec un peu de lag....ça donne l' impression d' un clignotement irregulier...
Code PHP:

default
{
    
state_entry()
    {
        
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POINT_LIGHT,TRUE,
                                    <
1.0,llFrand(1.0),0.0>,  // couleur RVB   
                                    
1.0,            // intensité            (varie entre 0.0 et 1.0)
                                    
2.0,           // rayon                (varie entre 0.1 et 10.0)
                                    
0.5 ]);         // vitesse d'extinction (varie entre 0.01 et 1.0)
 
        
llSleep(0.2);
        
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POINT_LIGHT,FALSE,
                                    <
1.0,llFrand(1.0),0.0>,  // couleur RVB   
                                    
1.0,            // intensité            (varie entre 0.0 et 1.0)
                                    
2.0,           // rayon                (varie entre 0.1 et 10.0)
                                    
0.5 ]);         // vitesse d'extinction (varie entre 0.01 et 1.0)
 
        
llSleep(0.1);
        
llResetScript();
    }

Citation :
Publié par MenthalOH
Rere...il y a eventuellement un moyen pour se passer du timer....avec ce script....le changement se faisant tous les 2/10eme de sec...ce qui est déjà sympa visuellement, surtout avec un peu de lag....ça donne l' impression d' un clignotement irregulier...
Astucieux. Mais je n'étais pas certaine que la relance continuelle du script ne soit pas moins laggy que le timer.

Alors j'ai testé. Ok c'est un peu mieux:
version reset : 0.006 s
version timer : 0.007 s (même script en mettant le clignotement (avec son sleep 0.2) dans un timer 0.1).

Par contre j'ai voulu faire un clignotement irrégulier en mettant de l'aléatoire dans les 2 llSleep (llFrand(0.1)+0.1 pour le 0.2, et llFrand(0.05)+0.05 pour le 0.1). Faut pas. C'est une horreur : 0.079 s.

Dernière modification par Elenia B. ; 17/08/2013 à 10h00.
Bonjour....on peut egalement faire une version sans reset...mes mesures de performances me laissent souvent dubatatifs quand à la fiabilité, mais je pense que c 'est un peu mieux...
Code PHP:

default
{
    
state_entry()
    {
        
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POINT_LIGHT,TRUE,
                                    <
1.0,llFrand(1.0),0.0>,  // couleur RVB   
                                    
1.0,            // intensité            (varie entre 0.0 et 1.0)
                                    
2.0,           // rayon                (varie entre 0.1 et 10.0)
                                    
0.5 ]);         // vitesse d'extinction (varie entre 0.01 et 1.0)
 
        
llSleep(0.2);
        
state off;
    }
}
 
 
state off
{
        
state_entry()
    {
 
        
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POINT_LIGHT,FALSE,
                                    <
1.0,1.0,1.0>,  // couleur RVB   
                                    
1.0,            // intensité            (varie entre 0.0 et 1.0)
                                    
2.0,           // rayon                (varie entre 0.1 et 10.0)
                                    
0.5 ]);         // vitesse d'extinction (varie entre 0.01 et 1.0)
state default;
 
    }

Non je craignais qu'un reset script arrête la VM pour le script et la relance, ou reconstruise l'environnement, ou pire recompile le script, auquel cas cela aurait été lourd pour la sim.

Car quand on demande un reset dans la fenêtre d'édition cela prend du temp.

Mais non, on ne voit que la charge correspondante à l'activation de l'event state_entry.

Par contre le changement d'état à un coût plus élevé : 0.008 s
Citation :
Publié par Poisson.Soluble
Bon, si je comprends bien, il faut que je prenne la version reset, l'avant-dernière, c'est ça?
Oui. Mais bon à 6, 7 ou 8 ms il n'y a pas de quoi casser 3 pattes à un canard.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés