Mon premier Robot...

Répondre
Partager Rechercher
ou automate...


Ce script amusera les grands enfants que nous sommes et étonnera les débutants.

Le principe est simple.
  1. Sur un clic enregistrement des positions et rotations de avatar ( Owner ).
  2. Quand les enregistrements sont effectués on déplace l'objet sur les même positions (et rotations).
  3. Clic pour refaire les déplacements.
Une vidéo montrant le principe




Le script à insérer dans un box classique.

Code PHP:

// Glocal Variables //

list    Pos_Rot;
integer Max;
float   Rate .2;   // not so bad... 
vector  Origin_Pos;
integer Secure_Heap 50000// ** Warning **  dont be t < 1000 (protect heap collision)//


// Global Function //

Move()
// move across the land with the pos & rot recorded before
integer i;
vector   pos;
rotation rot;    
    
    
llSetText "Yeahhhhh!!!!!!!!!!",<0.0,1.0,0.0>,);
    
llSetStatus(STATUS_PHYSICSTRUE); // set the object physical
    
    
for ( 0<  llGetListLength(Pos_Rot); +)
    { 
// move to pos and do the rotate
        
pos = (vector)llList2String(Pos_Rot,i);
        
rot = (rotation)llList2String(Pos_Rot,i+1);
        
llMoveToTarget(pos,0.5);
        
llRotLookAtrot 0.2);
        
llSleep (Rate); // same that the recording but  can be different too
    
}
    
llSetStatus(STATUS_PHYSICSFALSE); // remove the status physical
    
llSetRotZERO_ROTATION); // remove the last rotation
    
llSetPos Origin_Pos); // go the origin position
    
llSetText "It was funny!",<0.0,1.0,0.0>,);  

}

Init(){ // Set the settings before all...
    
llSetRotZERO_ROTATION);
    
Origin_Pos llGetPos();  // save the pos before moving
    
llSetText " Click on me ... and move across the land  ",<0.0,1.0,0.0>,); // show the recording
}
// end declarations //


// Main program //
default
{
    
on_rez(integer Param)
    {
        
Init();
    }
    
    
state_entry()
    {
        
Init(); //  for the startup after compiler
    
}

    
touch_start(integer total_number)
    {
        if (
Max)
            
Move(); //  // If already recorded then  Move!!
        
else              
            
llSensorRepeat""llGetOwner(), ( AGENT ), 96PIRate);   // if not  start start recording
    
}
    
    
sensor(integer num_detected)
    {
        
Pos_Rot += [llDetectedPos0), llDetectedRot0)]; // record pos & rot
        
integer nb_record =  llGetListLengthPos_Rot );    // get the number of records 
    
        
if ( (integer) llGetFreeMemory() < Secure_Heap // set the minimum of memory possible (don't set below 1000!)
        
{
            
llSensorRemove(); // stop 
            
Move(); // and move!!
        
}
        else
            
llSetText ( (string) nb_record " positions recorded ",<0.0,1.0,0.0>,); // show the recording
    


La taille du script est limité en MONO à 64 Ko. L'enregistrement des positions et rotations n'est pas infini...
Pour protéger le script la mémoire restante du script au fur et à mesure des enregistrement est calculée par

llGetMemoryFree();

Si cette valeur < Secure_Heap on stoppe l'enregistrement.

J'ai mis 50000 ce qui est beaucoup mais simplement que je ne voulais pas attendre une éternité devant mon écran! 5000 = 220 records

Set Secure_Heap à la valeur qui vous convient mais pas < 1000 ( + 1500 records).

Rate est échantillonnage (1 / (mouvement / seconde)) ici .2 ( 5 images/seconde) vous pouvez allez plus vite ou moins vite.
Amusant - et très simple comme script.

comme quoi il n'y a pas besoin de monter des usines à gaz.

je me suis cassée la tête a configurer des tours de sim en enregistrant le parcours dans des notecards. Avec ce petit script c'est beaucoup plus simple. Mais faut pas aller à plus de 96m de l'objet enregistreur. Quoique qu'avec un follower en prime.
A quoi cela peut il servir?

Pour moi à enchainer sur la suite

Pour vous..

Une vidéo explicative:


ou

Click droit sur l'objet and sit... pour visualiser in Game.

Incredible!!

J'ai pas déposé de brevet...profitez en!


Plus sérieusement...

Cela peut être une très bonne base d'une montgolfière, un train, un bateau ... etc qui fonctionnerai en mode auto... pour un parcours ludique
de découverte d'un point touristique par exemple.
Citation :
Publié par Elenia Boucher
Amusant - et très simple comme script.

comme quoi il n'y a pas besoin de monter des usines à gaz.

je me suis cassée la tête a configurer des tours de sim en enregistrant le parcours dans des notecards. Avec ce petit script c'est beaucoup plus simple. Mais faut pas aller à plus de 96m de l'objet enregistreur. Quoique qu'avec un follower en prime.

:-) exact.
Citation :
Publié par Elenia Boucher
Avec ce petit script c'est beaucoup plus simple. Mais faut pas aller à plus de 96m de l'objet enregistreur. Quoique qu'avec un follower en prime.
On peut tres bien utiliser autre chose que le sensor qui ne limite plus a 96m => llGetObjectDetails( llGetOwner(), [OBJECT_POS]); + timer
Exact, associé à un llSleep (Rate), étend la plage de fonctionnement sur une région entière.

llSensor() ouvre un champs d'action plus vaste en changeant le filtre.

(Exemple si on veut faire enregistrer les pos & rot de plusieurs avatars en action etc..).

Les 2 ont leurs avantages et inconvénients.
Bonjour Tous,

Je dois être trop vieux pour comprendre car mon test n'est pas concluant, je n'arrive pas à lui faire faire ce que je veux.

Mais peut être que je n'ai pas compris comment le faire

Ce que j'ai cru comprendre :
- on clique sur l'objet qui contient le script
- on se déplace
- on reclique sur l'objet et il doit suivre la même trajectoire

Résultat : ça fait n'importe quoi et surtout pas ce que j'ai cru lui demander.

MDR
Moi ça marche sauf que mon cube prend des raccourcis parfois malgré mes clics successifs . Même que ce cube me bouscule , je suis sure qu'il m'aime pas en tout cas merci c'est vraiment marrant . Il m'en faut pas beaucoup pour m'amuser comme une gosse .
Et Dominique je fais comme toi , juste des clics sur l'objet et je me déplace et reclique .
Citation :
Publié par mysteriosa1
Moi ça marche sauf que mon cube prend des raccourcis parfois malgré mes clics successifs . Même que ce cube me bouscule , je suis sure qu'il m'aime pas en tout cas merci c'est vraiment marrant . Il m'en faut pas beaucoup pour m'amuser comme une gosse .
Et Dominique je fais comme toi , juste des clics sur l'objet et je me déplace et reclique .
Bonjour Mysteriosa,

Hihi moi aussi, il me bouscule, on doit avoir la même version agressive

Encore un doute, tu dis : juste des clics sur l'objet et je me déplace et reclique.
J'avais cru comprendre en voyant la vidéo qu'il fallait cliquer pour qu'il enregistre nos mouvements (trajectoire) et qu'au second clic il devait reproduire ce que l'on avait fait ?
Chaque fois que je m'arrête je reclique sur la boite pour qu'elle prenne en compte mon déplacement et entre mes nouvelles coordonnées en mémoire . C'est la succession de ces clics qui vont faire le chemin de ta boite .
Et là je suis plus sûre de rien je l'ai fait avec un autre avatar lol , je recommence .
Oui ça marche enfin , il prend toujours les raccourcis lol et me bouscule le vilain .
La procédure est la suivante vous suivez?? j'en vois un qui écoute pas!

OK

1. On reset le script (ou on le rez again)

2. on clique de dessus et la procédure de recording start

3 On cours on marche on vole etc...

4 Quand le zinzin est full up (avec vos paramétrages) il refait seul la trajectoire est disant weahhhh et s'arrete.

5 là si on clique et il repart.. alors autant s'assoir avant dessus et... cliquez après. etc...

6 si on veut refaire un recording on repart du point 1
Si vous voulez vraiment jouer plus avant je vous propose des pistes à tester et scripter ( petit niveau de script (simple) ):

la hauteur du cube est égale ~ à la hauteur de votre avatar / 2 ... ( approx = llGetAgentSize)/2 + sol ( llGround)

donc remplacer z ( pos.z ) par la hauteur de votre objet / 2.

exemple sol = 20m avatar= 2 m objet=0.5

pos.z actuelle = 20 + 2/ 2 = 21 m

pos.z possible = 20 + .5 / 2 = 20.25m


je vous laisse scripter cela...


Si le sol est vraiment bosselé le cube va 'taper' les bosses donc il faut anticiper Prendre la hauteur de la prochaine position ou plus ...

exemple 20 m(pos n) 20,5m (pos n+1) 21.2m (pos n+2) etc...

donc llGround (offset entre les 2 positions) donnera la hauteur de la prochaine position.

etc...

Une fois cela fait ajouter un offset à x et y ( translation )

exemple <150,151, ?> donnera <155,157, ?> si offset = < 5,6,0> et tester

ajouter de l'anarchie en rajoutant un offset aléatoire llFrand ...

etc...

good fun!

Seb,
Et tu fais comment pour dire que tu as fini ton périple, pour qu'il refasse toujours le même circuit ?


Oups j'ai parlé en même temps que le Prof. aie pas la tête.

SEB : j'ai compris mais il manque alors un hud pour pouvoir faire début d'enreg et fin d'enreg, non ?
Seb doucement niveau bébé débutant , pfftt même après 40 ans y'a des devoirs à faire . Merci Seb c'est vraiment intéressant et au moins j'ai compris le principe (pour une fois ) .
Citation :
Publié par Dominique DEBEVEC
Et tu fais comment pour dire que tu as fini ton périple, pour qu'il refasse toujours le même circuit ?


Oups j'ai parlé en même temps que le Prof. aie pas la tête.

SEB : j'ai compris mais il manque alors un hud pour pouvoir faire début d'enreg et fin d'enreg, non ?

J'ai modifié le script vite fait:

Code PHP:

// Glocal Variables //
integer Touches;
list    
Pos_Rot;
integer Max;
float   Rate .2;   // not so bad... 
vector  Origin_Pos;
integer Secure_Heap 50000// ** Warning **  dont be t < 1000 (protect heap collision)//


// Global Function //

Move()
// move across the land with the pos & rot recorded before
integer i;
vector   pos;
rotation rot;    
    
    
llSetText "Yeahhhhh!!!!!!!!!!",<0.0,1.0,0.0>,);
    
llSetStatus(STATUS_PHYSICSTRUE); // set the object physical
    
    
for ( 0<  llGetListLength(Pos_Rot); +)
    { 
// move to pos and do the rotate
        
pos = (vector)llList2String(Pos_Rot,i);
        
rot = (rotation)llList2String(Pos_Rot,i+1);
        
llMoveToTarget(pos,0.5);
        
llRotLookAtrot 0.2);
        
llSleep (Rate); // same that the recording but  can be different too
    
}
    
llSetStatus(STATUS_PHYSICSFALSE); // remove the status physical
    
llSetRotZERO_ROTATION); // remove the last rotation
    
llSetPos Origin_Pos); // go the origin position
    
llSetText "It was funny! \n==>short click to replay or loooong click to reset",<0.0,1.0,0.0>,);  

}

Init(){ // Set the settings before all...
    
llSetRotZERO_ROTATION);
    
Origin_Pos llGetPos();  // save the pos before moving
    
llSetText " Click on me ... and move across the land  ",<0.0,1.0,0.0>,); // show the recording
    
Touches 0;
}
// end declarations //


// Main program //
default
{
    
on_rez(integer Param)
    {
        
Init();
    }
    
    
state_entry()
    {
        
Init(); //  for the startup after compiler
    
}

    
touch_start(integer total_number)
    {
        
llResetTime();        
    }
    
    
touch_end(integer total_number)
    {
        if ( 
llGetTime() > 2.0 )
            
llResetScript();
            
        if (
Max
            
Move();
        if ( 
Touches ==)
        {
            
llSensorRepeat""llGetOwner(), ( AGENT ), 96PIRate);   // if not  start start recording    
        
        
++Touches
        }
        else  if (
Touches == 1)
            {
                
llSensorRemove(); // stop 
                
llSetText "End of recording [Manual stop] \n ==> Click for start!",<0.0,1.0,0.0>,);                              
                ++
Touches
            }
        else if (
Touches == 2
            {
                
Move();
            }  
    }
    
    
sensor(integer num_detected)
    {
        
Pos_Rot += [llDetectedPos0), llDetectedRot0)]; // record pos & rot
        
integer nb_record =  llGetListLengthPos_Rot );    // get the number of records 
    
        
if ( (integer) llGetFreeMemory() < Secure_Heap // set the minimum of memory possible (don't set below 1000!)
        
{
            
llSensorRemove(); // stop 
            
llSetText "End of recording [Memory full] (" + (string) nb_record " records )\n ==>Click for start!",<0.0,1.0,0.0>,);
            
Max TRUE;
        }
        else
            
llSetText ( (string) nb_record " positions recorded ",<0.0,1.0,0.0>,); // show the recording
    


J'ai rusé sur les "touch" je mettrai cela dans le wiki

Bref:

1 clic on enregistre un second on stoppe.

Après chaque clic ferai rejouer le parcours

(Si mémoire full idem)

1 LOOONG clic (===>à la fin du parcours <===) resetera le script..... .

J'ai pas trop testé mais cela devrait le faire...

Très bon exemple pour se lancer dans les states.. state "record" state "play" state "etc"
N'est-ce pas un tel script qui est déjà utilisé par certains animaux de chez Zoobie pour lesquels on peut programmer un programme de promenade (option "Patrol", je crois) ?
Répondre

Connectés sur ce fil

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