[RESOLU À INTÉGRER AU WIKI SVP] Porte avec une ouverture en "creux"...

Répondre
Partager Rechercher
Bonjour,

Pour faire une porte, je suis a la recherche d'un script qui créé un trou dans une prim, comme si on utilisais la fonction "creux" de l'édition en la faisant passer de 0 au maximum.

L'idéal serait que cette porte s'ouvre quand on la touche et qu'elle se referme automatiquement après un temps réglable.

Merci d'avance.
C'est une bonne idée j'y aurais jamais pensé!

Je t'ai écris ça rapidement.

Met le dans un cube (la taille n'a pas d'importance, c'est comme tu veux) et fais le tourner de 90° sur l'axe X ou Y (le creux se forme obligatoirement sur l'axe Z donc on est obliger de faire une rotation de 90°)

Pour définir la taille de la porte plus facilement (pour pas se mélanger les pinceaux avec les axes) je te conseille de mettre en premier le script. De toucher la porte pour l'ouvrir (faire le creux) et de la redimensionnée comme tu le souhaite. C'est le plus simple


Code PHP:

// La porte commence fermée
integer OpenClose 0;

default
{
    
// Quand on touche la Prim
    
touch_start(integer total_number)
    {
        
// Si la porte est fermée...
        
if (OpenClose == 0)
        {
            
// On l'ouvre en créant un creux.
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
1.0,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                    
]);
            
// On dit au script que la porte est maintenant ouverte.
            
OpenClose 1;

            
// Et on lance un timer pour la fermeture automatique
            
llSetTimerEvent(10); // Remplacez 10 par ce que vous voulez (en secondes)
        
}
        
// Sinon si la porte est ouverte...
        
else if (OpenClose == 1)
        {
            
// On la referme en "bouchant" le creux.
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.0,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                    
]);
            
// Et on dit au script que la porte est maintenant fermée.
            
OpenClose 0;

            
// Ne pas toucher! On arreter le timer quand il ne sert plus à rien
            
llSetTimerEvent(0);
        }
    }

    
// Evénement déclenché par le timer
    
timer()
    {
        
// On referme la porte en "bouchant" le creux.
        
llSetPrimitiveParams([PRIM_TYPE,
            
PRIM_TYPE_BOX,
            
PRIM_HOLE_DEFAULT,  // forme du trou
            
<0.001.00.0>,   // découpe
            
0.0,                // creux
            
<0.00.00.0>,    // torsion
            
<1.01.00.0>,    // différence de taille
            
<0.00.00.0>     // différence d'inclinaison
                
]);
        
// Et on dit au script que la porte est maintenant fermée.
        
OpenClose 0;

        
// Ne pas toucher! On arreter le timer quand il ne sert plus à rien
        
llSetTimerEvent(0);

    }



Pour réglé le temps après lequel la porte se referme, c'est à la ligne 26. Remplace 10 par ce que tu veux (en secondes)
Si ta porte est un cylindre, remplace les deux "PRIM_TYPE_BOX" (ligne 33 et 54)par "PRIM_TYPE_CYLINDER" (sans les guillemets)


Si tu veux je peux aussi t'ajouter une "serrure" avec liste et seul ceux qui seront dans la liste pourront l'ouvrir.


Citation :
Publié par Lundrah
J'ai vu ce genre de porte dans les superbes builds de sextan et j'avoue que j'aimerais bien savoir aussi comment ça fonctionne, l'effet est vraiment bien.
Je paierais bien pour avoir ce script...
Pas besoin de payer
Ça m'as pris 5 minutes.
Super, K-dence, ça fonctionne !!!

J'ai juste oublié de préciser que, comme il s'agit d'une porte, ce serait mieux si l'ouverture n'était pas instantané mais progressive (en 1 ou 2 sec par exemple) et la refermeture aussi.

Merci
Je peux faire ça, en effet ce serait plus joli. Je m'y met et je te redis

EDIT : Bon j'ai essayer rapidement et franchement c'est pas très joli.
La fonction llSetPrimitiveParams fait dormir le script pendant 0.2 seconde et donc ça donne un effet saccader du plus mauvais gout.
C'est dommage, mais c'est impossible à faire sans cet effet.

Je m'était déjà heurter à ce problème en essayant de faire rayonner un objet de façon progressive. C'était trop laid! J'ai préférer que ce soit instantané.

Si tu veux voir par toi même : (il n'y a que l'ouverture qui est progressive)
Code PHP:

// La porte commence fermée
integer OpenClose 0;

default
{
    
// Quand on touche la Prim
    
touch_start(integer total_number)
    {
        
// Si la porte est fermée...
        
if (OpenClose == 0)
        {
            
// On l'ouvre en créant un creux.

            
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.05,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);
            
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.1,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.15,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.2,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.25,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.3,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.35,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);
            
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.4,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.45,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);
            
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.5,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.55,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.6,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);
            
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.65,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.7,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.75,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);
            
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.8,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.85,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.9,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.95,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);

            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
1,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                
]);






                
            
// On dit au script que la porte est maintenant ouverte.
            
OpenClose 1;

            
// Et on lance un timer pour la fermeture automatique
            
llSetTimerEvent(10); // Remplacez 10 par ce que vous voulez (en secondes)
        
}
        
// Sinon si la porte est ouverte...
        
else if (OpenClose == 1)
        {
            
// On la referme en "bouchant" le creux.
            
llSetPrimitiveParams([PRIM_TYPE,
                
PRIM_TYPE_BOX,
                
PRIM_HOLE_DEFAULT,  // forme du trou
                
<0.001.00.0>,   // découpe
                
0.0,                // creux
                
<0.00.00.0>,    // torsion
                
<1.01.00.0>,    // différence de taille
                
<0.00.00.0>     // différence d'inclinaison
                    
]);
            
// Et on dit au script que la porte est maintenant fermée.
            
OpenClose 0;

            
// Ne pas toucher! On arreter le timer quand il ne sert plus à rien
            
llSetTimerEvent(0);
        }
    }

    
// Evénement déclenché par le timer
    
timer()
    {
        
// On referme la porte en "bouchant" le creux.
        
llSetPrimitiveParams([PRIM_TYPE,
            
PRIM_TYPE_BOX,
            
PRIM_HOLE_DEFAULT,  // forme du trou
            
<0.001.00.0>,   // découpe
            
0.0,                // creux
            
<0.00.00.0>,    // torsion
            
<1.01.00.0>,    // différence de taille
            
<0.00.00.0>     // différence d'inclinaison
                
]);
        
// Et on dit au script que la porte est maintenant fermée.
        
OpenClose 0;

        
// Ne pas toucher! On arreter le timer quand il ne sert plus à rien
        
llSetTimerEvent(0);

    }



Ok, K-dence, c'est super cool d'avoir fait ce script, moi personnellement je le trouve mieux malgré les saccades, tu peux mettre la refermeture aussi en progressif ?

Merci du mal que tu te donnes.
J'ai pas regardé le script de près (il me semble qu'il y a beaucoup de lignes pour faire ça ) mais si le seul problème vient de la tempo de 0,2s il suffit d'utiliser llSetLinkPrimitiveParamsFast.

Edit : j'ai écrit une version plus courte :

Code PHP:

// Etat de la porte
integer i_open FALSE;

// Temps de base
float f_time .02;

// Valeur de l'ouverture
float f_hole 1.0;

action()
{
    
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TYPE,
        
PRIM_TYPE_BOX,
        
PRIM_HOLE_DEFAULT,  // forme du trou
        
<0.001.00.0>,   // découpe
        
f_hole,                // creux
        
<0.00.00.0>,    // torsion
        
<1.01.00.0>,    // différence de taille
        
<0.00.00.0>     // différence d'inclinaison
            
]);
}

end()
{
    
llSetTimerEvent(.0);
    
i_open = !i_open;
}

default
{
    
touch_start(integer total_number)
    {
        
llSetTimerEvent(f_time);
    }

    
timer()
    {
        
// Fermeture
        
if(i_open)
        {
            
f_hole += .05;
            
action();
            if(
f_hole >= 1.0end();
        }
        
// Ouverture
        
else
        {
            
f_hole -= .05;
            
action();
            if(
f_hole <= .0end();
        }
    }

On peut encore l'optimiser mais je voulais qu'elle reste lisible.
Ok, je connaissait pas cette fonction (même LSLEditor ne l'a connait pas et elle est pas sur le wiki français) .

Je ferai tous ça un peu plus tard en essayant cette fonction.

C'est que j'ai aussi mon script à travailler

EDIT : C'est bon je vois que j'ai plus rien à faire et en plus c'est beaucoup mieux optimiser que le mien
Ok merci pour le lien

Et l'air de rien tu m'as appris quelque chose. Je savais pas comment répéter une fonction comme tu l'a fait avec "action()" sans devoir la réécrire à chaque fois

Enfin je savais que c'était possible mais une fois en essayant j'avais eu une erreur (je sais plus laquelle) alors j'ai pensé que ça marchais pas
Mais ça venais surement de moi ^^


EDIT : D'ailleurs, j'ai une question à ce propos.

Est-ce qu'une fonction qui se répète à plusieurs endroit du script sans changer (par exemple : llDialog(listen, message_menu, menu, Canal); vaut la peine qu'on la mette dans un bloc de ce type? (d'ailleurs comment est-ce qu'on appelle un bloc comme ça?)
Citation :
Publié par K-dence
EDIT : D'ailleurs, j'ai une question à ce propos.

Est-ce qu'une fonction qui se répète à plusieurs endroit du script sans changer (par exemple : llDialog(listen, message_menu, menu, Canal); vaut la peine qu'on la mette dans un bloc de ce type? (d'ailleurs comment est-ce qu'on appelle un bloc comme ça?)
Une règle : ne jamais avoir plusieurs fois le même code dans un script. Il vaut mieux créer une fonction personnalisée (ça s'appelle comme ça). Ça économise de la mémoire, ça simplifie les modifications, et en général ça rend le code plus clair.
Merci Sandrine et K-dence pour votre travail

Effectivement, Sandrine, ton script, est plus léger et plus fluide.

Peux tu donner la version avec une refermeture automatique au bout d'un temps réglable ?

Merci d'avance.
Citation :
Publié par Basilus03
Peux tu donner la version avec une refermeture automatique au bout d'un temps réglable ?

Merci d'avance.
Voilà :

Code PHP:



// Temps de base
float f_time .02;

// Valeur de l'ouverture
float f_hole .0;

// Délai avant fermeture automatique en secondes
float f_delai 20.0;

action()
{
    
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TYPE,
        
PRIM_TYPE_BOX,
        
PRIM_HOLE_DEFAULT,  // forme du trou
        
<0.001.00.0>,   // découpe
        
f_hole,             // creux
        
<0.00.00.0>,    // torsion
        
<1.01.00.0>,    // différence de taille
        
<0.00.00.0>     // différence d'inclinaison
            
]);
}


default
{
    
touch_start(integer total_number)
    {
        
llSetTimerEvent(f_time);
    }

    
timer()
    {
        
f_hole += .05;
        
action();
        if(
f_hole >= 1.0)
        {
            
llSetTimerEvent(.0);
            
state ouvert;
        }
    }
}
state ouvert
{
    
state_entry()
    {
        
llSleep(f_delai);
        
llSetTimerEvent(f_time);
    }

    
timer()
    {
        
f_hole -= .05;
        
action();
        if(
f_hole <= .0)
        {
            
llSetTimerEvent(.0);
            
state default;
        }
    }

Super, Sandrine !!!

Ça fonctionne très bien, merci de ton aide.

Voilà un script qui mérite d'intégrer la bibliothèque du wiki.

(En précisant bien qu'il est prévu pour une prim "box" et que pour une prim "cylindre" il suffit de remplacer "PRIM_TYPE_BOX" par "PRIM_TYPE_CYLINDER").

Et encore un grand merci à tout ceux qui animent ce précieux forum.
Effectivement, Ryou, personnellement je l'utilise sur une prim cylindrique et l'effet est génial.
Je tente de synchroniser une texture animée d'iris (comme un appareil photo), je n'y suis pas encore arrivé, mais ça va venir.
Et bien bravo vous y êtes arrivé sans moi

C'est moi qui avait scripté les portes de Sextan. Et comme à l'époque on avait pas les fonctions fast j'avais utilisé 10 scripts synchronisés.

Pour faire un effet d'iris, il faut combiner l'ouverture avec une rotation de la texture; Cela se fait dans la même instruction.
Voilà cadeau script complet que j'ai reécrit, avec ouverture et fermeture progressive. J'ai du ralentir car ça aller trop vite avec les nouvelles fonctions fast.
Et en prime une texture de diaphragme. A mettre dans une prim cylindre bien sur.

Code:
integer holeshape;
vector cut = <0.0, 1.0, 0.0>;
float hollow;
vector twist;
vector taper_b = <1.0, 1.0, 0.0>;
vector topshear;

integer ouvert;

ouvre(){
    integer i;
    for(i = 1; i<=10; i++){
            hollow = (float)i*0.1 ;
            llSetLinkPrimitiveParamsFast(0, [PRIM_TYPE, PRIM_TYPE_CYLINDER, holeshape, cut , hollow, twist, taper_b, topshear, PRIM_TEXTURE, ALL_SIDES, "cf20e026-5d2a-ee54-2a64-33402a43f483", <1,1,0>, <0,0,0>, (float)i*-.25]);
        llSleep(0.1); 
        }
}

ferme(){
    integer i;
    for(i = 10; i>=0; i--){
            hollow = (float)i*0.1 ;
            llSetLinkPrimitiveParamsFast(0, [PRIM_TYPE, PRIM_TYPE_CYLINDER, holeshape, cut , hollow, twist, taper_b, topshear, PRIM_TEXTURE, ALL_SIDES, "cf20e026-5d2a-ee54-2a64-33402a43f483", <1,1,0>, <0,0,0>, (float)i*-.25]);
        llSleep(0.1);  
        }
}


default{

    touch_start(integer tot){
        if(ouvert){
            ouvert = FALSE;
            ferme();
        }else{
            ouvert = TRUE;
            ouvre();
        }
    }

}
Répondre

Connectés sur ce fil

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