[résolu] volet roulant

Répondre
Partager Rechercher
j aimerai savoir s il est possible de faire des volets roulants qui s ouvrent et se ferment de bas en haut et de haut en bas avec une un interrupteur pour commander tous les volets de la maison en meme temps (2 volets)
Techniquement c'est possible et (pas trop compliqué) as tu fais des recherches sur Xstreet?

Si tu ne trouves rien de rien ... on essayera de te créer un truc sympa
J'ai vu ta demande de HUD et un volet qui monte ... dans un autre post lol...

Bref j'ai réalisé les scripts HUD + Volet + Objets (HUD + Volets)


Si tu es intéressé pour voir IG contacte moi en MP.

Je compléterai ce post plus tard en donnant scripts + photos + explications

HUD est un lapsus en fait c'est un objet plaqué au mur mais tu peux le mettre aussi sur ton écran ... c'est comme tu veux...
Part I
I Création du boitier mural


Créer un box standard et la configurer avec l'éditeur

vr1.png

vr2_1.png


Le script du boitier mural

Options choisies:

Les volets sont des objets libres

La distance max distance boitiers/volets 20m

Pas de limites pour le nombre de volets (presque..)

Plusieurs boitiers possibles commandant tous les volets ( en vue d'une possible séparation par pièce..)

Canaux de comm non accessible et aléatoires.

Le script

Code PHP:

// variables globales //
integer listen_handle_1// handler du  Listen

integer Reset_Syn_Channel;  // channel reservé à l'information " script de volet  reseté"

string   Action// action demandée ( Up/Down)

integer Channel_SYNC;
integer Channel_Used;

key     UUID_UP      "68114f49-b25b-9073-d6c4-84cbd544a4de";  // pic avec fleche UP rouge
key     UUID_DOWN    "c3c8b4de-df83-1873-bdb7-5e26992a1696";  // pic avec fleche DOWN rouge
key     UUID_STAND_BY "920febfb-f1b1-0389-3934-9f22c1333612"// 2 fleches vertes

// code executable //
default
{
    
on_rez (integer start_param)
    {
        
llResetScript();     // force le reset du script 
    
}
    
    
state_entry()
    {
        
llSetColor ( <0.0,0.0,0.0> , ALL_SIDES); // all black
        
llSetColor ( <1.0,1.0,1.0> , 4);         // side used is blank
        
llSetTexture UUID_STAND_BY,); // texture 2 fleches vertes 
        
        
Channel_SYNC      = -1000;      // canal sortant HUD ==> volets  
        
Reset_Syn_Channel = -1010;      // canal entrant Volets ==> HUD
            
        
Channel_Used = (integer) llFrand(1000) * -12345;  // canal aléatoire 
        
        
listen_handle_1 llListen(Reset_Syn_Channel"""""");        // listen started
        
        
llOwnerSay   ("Synchro asked...");        
        
llSay    (Channel_SYNC, (string) (Channel_Used));  // communique le canal devant être utilisé pour communiquer

    
}
    
    
touch_start(integer num_detected)
    {
        
vector position llDetectedTouchST(0); // detecte la position du click de souris....
        
        
llSetTimerEvent (2); // la pic correspondant au click sera maintenue affichée 2 secondes
        
        
if (position.0.5
        {   
            
llSetTexture UUID_UP,); // on affiche la fleche UP rouge
            
Action "UP";
        }
        else
        {   
            
llSetTexture UUID_DOWN,4); // on affiche la fleche DOWN rouge
            
Action "DOWN";
        }
        
llSay(Channel_UsedAction); // communique l'action choisie aux volets
        // llOwnerSay((string )Channel_Used); // Debug control canaux
    
}
    
    
listeninteger channelstring namekey idstring message )
    {
        if (
message == "ASK_SYNC");  //  un reset a été réalisé sur des scripts des  volets. Il redemande le channel de comm..
        
{
            
llOwnerSay   ("Synchro asked...");        
            
llSay    (Channel_SYNC, (string) (Channel_Used));     // on  redonne le cannal de com...        
    
}   }
    
    
    
timer()
    {
        
llSetTexture UUID_STAND_BY,);  //   retour à deux flèches vertes...
    
}
     

vr3.png

vr4.png


// Fin Part I
II Créations Volets


Petit film photos pour être faciliter les explications:

vr5.png

vr6.png

vr7.png

vr8.png

Le script
Code PHP:

integer Channel_Syn_Channel;
integer Reset_Syn_Channel;

float   X;
float   Y;
float   Z;

string Shutter;

Motor (string action)
{
// Methode testée  et retenue prim fixe  gestion de la texture un petit flash à la fin 
// mais le resultat  est très satisfaisant.
//
// l'image est composée de 2 zones 1 pleine  1 transarente 
// l'astuce a été  d'affichée au départ la zone pleine  (volet fermé ) et de deplacer l'image vers la zone transparente
// ou vice et versa  zone transparente vers zone pleine
// en fin d'animation on affiche la partie pleine or transparente en jouant de l'offset...     
// on synchronise les timing sleep & animation ...

    
if  ( action == "DOWN"  &  Shutter == "OPENED")  
    {
        
llSetTextureAnim(ANIM_ON  SMOOTH LOOP REVERSEALL_SIDES 2211, -0.25);        
        
llSleep(4);
        
llSetTextureAnim(FALSEALL_SIDES000.00.01.0);  // stop l'animation
        
        
llSetPrimitiveParams([  PRIM_TEXTURE
                                
ALL_SIDES
                                
"e5f7ea6d-ce87-edc9-ea39-7d658c73ff1c",  // image 2 zones
                                
<.5,1.0,0.0>,   //   1/2 image
                                
<0.25,0.0,0.0>, //   offset    
                                
PI_BY_TWO ]);  
        
Shutter "CLOSED";
    }
    else if (
action == "UP"  Shutter == "CLOSED"
    {
  
        
llSetTextureAnim(ANIM_ON  SMOOTH LOOP REVERSEALL_SIDES 22120.25);        
        
llSleep(4);
        
llSetTextureAnim(FALSEALL_SIDES000.00.01.0); // stop l'animation
        
        
llSetPrimitiveParams([  PRIM_TEXTUREALL_SIDES"e5f7ea6d-ce87-edc9-ea39-7d658c73ff1c",
                                <
.5,1.0,0.0>, <0.75,0.0,0.0>,PI_BY_TWO]);  
        
Shutter "OPENED"
    }
    

}


default
{
    
on_rez(integer param)
    {   
        
llResetScript();// Force the reset on rez.
    
}

    
state_entry()
    {           
        
// Size  prim // >>>>>>>>>>>>A PARAMETRER  
        
=  9.7627;      
        
=  0.010;      
        
=  6.595;    
        
        
llSetScale ( < X,Y,> );
        
        
        
        
llSetPrimitiveParams([PRIM_TEXTUREALL_SIDES"e5f7ea6d-ce87-edc9-ea39-7d658c73ff1c",
                          <
.5,1.0,0.0>, <0.75,0.0,0.0>,PI_BY_TWO]);  // volet ouvert
        
        
Shutter "OPENED"// status volet....  
        
        
        
Channel_Syn_Channel = -1000;   //  canal de reception du channel  de com qui va être utilisé
        
Reset_Syn_Channel   = -1010;   //  canal sortant pour indiqué au HUD  que l'on désire connaitre le cannal à utilisé 
        
        
llListen(Channel_Syn_Channel""""""); // on est pret à recevoir le cannal de comm à utilisé 
        
        
llSay (Reset_Syn_Channel"ASK_SYNC");   // on demande le canal....          

    
}
    
    
    
listeninteger channelstring namekey idstring message )
    {
        if (
channel == Channel_Syn_Channel)  
        {
            
llListen((integer) message""""""); // Le message du HUD contient le ou si plusieurs boitiers plusieurs cannaux
            
llOwnerSay ("Synchro done with the HUD");// C'est gràce à cela que les volets pourront être  pilotés.... par plusieurs boitiers....        
        
}
        else 
            
Motormessage );  // Action!!

    
}


vr9.png
vr10.png


vr12.png

vr 14.png

La mise en place prend 3 minutes... (only 2 prims) montre en main...

J'ai pas rencontrer de problèmes si tu relevais un bug fais moi en part stp.

Les 2 scripts peuvent être modifiée facilement pour gérer les volets pièce par pièces.

De même que remplacer les volets par une gestion de vitres opaques <====> transparentes est un jeu d'enfant ...

Vidéo
Citation :
Publié par arkoiuga
merci seb
j ai tout réussis tout fonctionne. Juste une petite chose j essais de mettre ma texture sur le volet je n y arrive pas il repasse an noir a chaque fois

Ok

edit une box

et implémente çà

Code PHP:

default
{
    
state_entry()
    {
        
llSetTexture("e5f7ea6d-ce87-edc9-ea39-7d658c73ff1c"4);

    }

regarde bien comment a été créée la texture

une partie transparente une partie pleine

inspire toi de cela pour en réaliser une avec TA texture (sur un logiciel photo externe)

ensuite importe là

dans ton inventaire copy to UUID

et remplace mon UUID par la tienne ...

C'est tout

si tu t'en sors pas

tu me donneras ta texture je te ferai le mask ...

Ps bravo pour le sans faute...
encore merci seb pour tes reponses rapides
j ai un souci je c est pas ce que c est : copy to UUID et remplace mon UUID par la tienne
et comment fait t on une texture a moitié transparente ?
il y a beaucoup de façon de le faire... du plus simple au plus compliqué...

une des méthodes simple

c'est de récupérer un couche alpha nom de code pour la transparence ou de la créer.
1 tu en récupère une n'importe où y compris celle de SL...

2 tu créé un image vierge et tu utilises ton logiciel pour la rendre transparente
bcp de logiciel le font je te rassure en générale l transparence est représente par un damier(quand tu la réalisée).

Ensuite tu prends ta texture et tu la colle en la dimensionant à la moité de l'autre comme ma texture

Tu la sauvegarde en png ( qui gère la couche alpha ...pas de jpeg/bmp ).

Tu l'importes de ton pc sur sl

Tu cliques droit sur le nom dans ton inventaire et tu as une option

UUID Invent.png

ensuite Copy or Ctrl +v dans le code du script



j'ai modifié le code pour rendre UUID plus facile à géer:

Code PHP:

integer Channel_Syn_Channel;
integer Reset_Syn_Channel;

string  Channel_User;

float   X;
float   Y;
float   Z;

key UUID_Shuter "e5f7ea6d-ce87-edc9-ea39-7d658c73ff1c" /// UUID à replacer ICI

string Shutter;

Motor (string action)
{
// Methode testée  et retenue prim fixe  gestion de la texture un petit flash à la fin 
// mais le resultat  est très satisfaisant.
//
// l'image est composée de 2 zones 1 pleine  1 transarente 
// l'astuce a été  d'affichée au départ la zone pleine  (volet fermé ) et de deplacer l'image vers la zone transparente
// ou vice et versa  zone transparente vers zone pleine
// en fin d'animation on affiche la partie pleine or transparente en jouant de l'offset...     
// on synchronise les timing sleep & animation ...

    
if  ( action == "DOWN"  &  Shutter == "OPENED")  
    {
        
llSetTextureAnim(ANIM_ON  SMOOTH LOOP REVERSEALL_SIDES 2211, -0.25);        
        
llSleep(4);
        
llSetTextureAnim(FALSEALL_SIDES000.00.01.0);  // stop l'animation
        
        
llSetPrimitiveParams([  PRIM_TEXTURE
                                
ALL_SIDES
                                
UUID_Shuter,  // image 2 zones
                                
<.5,1.0,0.0>,   //   1/2 image
                                
<0.25,0.0,0.0>, //   offset    
                                
PI_BY_TWO ]);  
        
Shutter "CLOSED";
    }
    else if (
action == "UP"  Shutter == "CLOSED"
    {
  
        
llSetTextureAnim(ANIM_ON  SMOOTH LOOP REVERSEALL_SIDES 22120.25);        
        
llSleep(4);
        
llSetTextureAnim(FALSEALL_SIDES000.00.01.0); // stop l'animation
        
        
llSetPrimitiveParams([  PRIM_TEXTUREALL_SIDESUUID_Shuter,
                                <
.5,1.0,0.0>, <0.75,0.0,0.0>,PI_BY_TWO]);  
        
Shutter "OPENED"
    }
    

}


default
{
    
on_rez(integer param)
    {   
        
llResetScript();// Force the reset on rez.
    
}

    
state_entry()
    {           
        
// Size  prim // >>>>>>>>>>>>A PARAMETRER  
        
=  8.700;      
        
=  0.010;      
        
=  7.068;    
        
        
llSetScale ( < X,Y,> );
        
        
        
        
llSetPrimitiveParams([PRIM_TEXTUREALL_SIDESUUID_Shuter,
                          <
.5,1.0,0.0>, <0.75,0.0,0.0>,PI_BY_TWO]);  // volet ouvert
        
        
Shutter "OPENED"// status volet....  
        
        
        
Channel_Syn_Channel = -1000;   //  canal de reception du channel  de com qui va être utilisé
        
Reset_Syn_Channel   = -1010;   //  canal sortant pour indiqué au HUD  que l'on désire connaitre le cannal à utilisé 
        
        
llListen(Channel_Syn_Channel""""""); // on est pret à recevoir le cannal de comm à utilisé 
        
        
llSay (Reset_Syn_Channel"ASK_SYNC");   // on demande le canal....          

    
}
    
    
    
listeninteger channelstring namekey idstring message )
    {
        if (
channel == Channel_Syn_Channel)  
        {
            
llListen((integer) message""""""); // Le message du HUD contient le ou LES CANAUX à utilisé
            
llOwnerSay ("Synchro done with the HUD");// C'est gràce à cela que les volet pourront être  piloté par plusieurs HUD....        
        
}
        else 
            
Motormessage );  // Action!!

    
}


voilà

la texture utilisée

volet_1_demo.png
me revoili me revoila seb avec mon volet
j ai bien reussi a faire la texture tout est ok mais encore un tit soucis avec la photo tu comprendra tout.

https://forums.jeuxonline.info/attachment.php?attachmentid=63917&amp;stc=1&amp;d=1230740715
le prims que je fais pour la fenetre est a la taille de la fenetre
et ensuite il est devient plus grand comme tu vois sur la photo mais que dans le sens de la hauteur.
Images attachées
 
Bravo!

1.stop ton script ( running off ) position basse (fermé donc)
2. ensuite regle le correctement en hauteur z (reajuste la position si besoin)
3. note la valeur Z donnée dans édit
4. reporte cette valeur dans le script
5. compile le + running on
6. cela devrait le faire

// Size prim // >>>>>>>>>>>>A PARAMETRER
X = 8.700;
Y = 0.010;
Z = 7.068; <====== Hauteur ton volet
Merci seb pour ce joli tuto
J'ai fait des volets moi aussi tout fonctionne bien sauf un petit détail, en fait j ai fait de plus petits volets que les tiens et mon souci viens de la taille de la texture car quand mes volets déroules ça tourne un peu trop, presque en boucle (niveau anim texture), peut-on régler la hauteur de cette texture et si oui, quelle ligne du script.
Merci
Je suis étonné car la texture n'a pas d'importance que cela soit un volet de 10m
ou 1 m le temps sera identique pour la fermeture et l'ouverture

je viens de tester
http://www.wegame.com/watch/Grand_et_petit_volet/
la seule chose à faire c'est de copier UUID de la texture dans le script et de mettre dans le script les valeur définitives que tu as obtenu quand tu as fini d'ajuster tes dimensions ( que tu récupères dans edit x y z).

Le mieux à ce stade est de recopier MON UUID et te tester avec tes fenêtres.

Si après tu as toujours des problèmes je viendrai te voir IG.

vr6.png
vr10.png
Là je comprends mieux...


il n'y pas grand chose à faire je pense si c'est intrinsèque à la fonction "llSetTextureAnim"....

J'ai modifié le script maintenant il y a une variable appelée "Timing" pour régler le temps de l'animation donc le temps de montée et descente du volet...
<4 plus rapide
>4 moins rapide

Essaye de modifier cela pour tenter de contourner le lag.

3.8 3.6 etc
4.2 4.4 etc

Je suis très curieux techniquement du résultat...


Script modifié.
MAJ Xstreet faite aussi.

Code PHP:

integer Channel_Syn_Channel;
integer Reset_Syn_Channel;

string  Channel_User;

float   X;
float   Y;
float   Z;

string Shutter;
float Timing 4//   Ici on règle le temp de la l'animation donc le delai de fermeture et d'ouverture.... à ajuster

Motor (string action)
{
// Methode testée  et retenue prim fixe  gestion de la texture un petit flash à la fin 
// mais le resultat  est très satisfaisant.
//
// l'image est composée de 2 zones 1 pleine  1 transarente 
// l'astuce a été  d'affichée au départ la zone pleine  (volet fermé ) et de deplacer l'image vers la zone transparente
// ou vice et versa  zone transparente vers zone pleine
// en fin d'animation on affiche la partie pleine or transparente en jouant de l'offset...     
// on synchronise les timing sleep & animation ...

    
if  ( action == "DOWN"  &  Shutter == "OPENED")  
    {
        
llSetTextureAnim(ANIM_ON  SMOOTH LOOP REVERSEALL_SIDES 2111, -1/Timing);        
        
llSleep(Timing);
        
llSetTextureAnim(FALSEALL_SIDES000.00.01.0);  // stop l'animation
        
        
llSetPrimitiveParams([  PRIM_TEXTURE
                                
ALL_SIDES
                                
"e5f7ea6d-ce87-edc9-ea39-7d658c73ff1c",  // image 2 zones
                                
<.5,1.0,0.0>,   //   1/2 image
                                
<0.25,0.0,0.0>, //   offset    
                                
PI_BY_TWO ]);  
        
Shutter "CLOSED";
    }
    else if (
action == "UP"  Shutter == "CLOSED"
    {
  
        
llSetTextureAnim(ANIM_ON  SMOOTH LOOP REVERSEALL_SIDES 21121/Timing);        
        
llSleep(Timing);
        
llSetTextureAnim(FALSEALL_SIDES000.00.01.0); // stop l'animation
        
        
llSetPrimitiveParams([  PRIM_TEXTUREALL_SIDES"e5f7ea6d-ce87-edc9-ea39-7d658c73ff1c",
                                <
.5,1.0,0.0>, <0.75,0.0,0.0>,PI_BY_TWO]);  
        
Shutter "OPENED"
    }
    

}


default
{
    
on_rez(integer param)
    {   
        
llResetScript();// Force the reset on rez.
    
}

    
state_entry()
    {           
        
// Size  prim // >>>>>>>>>>>>A PARAMETRER  
        
=  0.010;      
        
=  8.347;      
        
=  6.700;    
        
        
llSetScale ( < X,Y,> );
        
        
        
        
llSetPrimitiveParams([PRIM_TEXTUREALL_SIDES"e5f7ea6d-ce87-edc9-ea39-7d658c73ff1c",
                          <
.5,1.0,0.0>, <0.75,0.0,0.0>,PI_BY_TWO]);  // volet ouvert
        
        
Shutter "OPENED"// status volet....  
        
        
        
Channel_Syn_Channel = -1000;   //  canal de reception du channel  de com qui va être utilisé
        
Reset_Syn_Channel   = -1010;   //  canal sortant pour indiqué au HUD  que l'on désire connaitre le cannal à utilisé 
        
        
llListen(Channel_Syn_Channel""""""); // on est pret à recevoir le cannal de comm à utilisé 
        
        
llSay (Reset_Syn_Channel"ASK_SYNC");   // on demande le canal....      
        
Motor ("DOWN");   

    }
    
    
    
listeninteger channelstring namekey idstring message )
    {
        if (
channel == Channel_Syn_Channel)  
        {
            
llListen((integer) message""""""); // Le message du HUD contient le ou LES CANAUX à utilisé
            
llOwnerSay ("Synchro done with the HUD");// C'est gràce à cela que les volet pourront être  piloté par plusieurs HUD....        
        
}
        else 
            
Motormessage );  // Action!!

    
}


Scrip corrigé le 15 Janvier 2009 suite problème mis en évidence par Ans que je remercie...
Effectivement j'ai testé le lag est si important que la synchro n'existe plus

Je t'explique le principe peut être peux tu ajuster les timings..

Code PHP:

     llSetTextureAnim(ANIM_ON  SMOOTH LOOP REVERSEALL_SIDES 2211,1/Timing);        
        
llSleep(Timing);
        
llSetTextureAnim(FALSEALL_SIDES000.00.01.0);  // stop l'animation 
le paramètre 1/Timing indique le nombre de frames à la seconde.

Prenons un exemple:

Pour un timing de 4s la vitesse sera 1/4 frame par seconde
comme nous avons 1 seule frame le temps sera donc égal = 4 secondes.
(4 * 1/4 pour afficher l'image totale)

donc on lance l'animation et on la stoppe après 4 secondes.

En cas de lag le temps du llSleep dérive il doit être de 4.5 s ou plus... du coup l'animation n'est pas stoppée au bout des 4 secondes...

J'ai une petite idée je vais tester ... @+

Mon idée n'a pas donner de résultat

Il y a trop de scripts en attente ou quelques uns pompent toute les ressources CPU de la région...

relevé de perfs sur la région...

LAG WV.png
Bravo pour ton script

Mais mais bin oui c'est pas parfait

Pour l'usage auquel tu l'as destiné oui à 99.9%

Mais si tu mets une texture avec rayures cela ne va pas , en effet il y a un changement de dimension entre l'enroulement et la position fermée!

Tu change la texture sur toutes les face mais bon c'est a modifier avec "face" et le N° de face c'est bien ça?

Dernier point le volet ouvert devrait être en fantôme cela serait encore mieux

Si tu souhaite voir le script avec la rayure je suis Online sous Ans Seetan

@+
Répondre

Connectés sur ce fil

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