Mon premier Robot...

Répondre
Partager Rechercher
le même non car il est mine à 100 % idée + principe + création.

Maintenant il est possible que 100 personnes su SL ont eu la même idée un jour..

Seb,
Bonjour

Et encore une fois merci de faire partager ce savoir et par là-même, d'en éclabousser les autres. Disposer de certaines pistes donne envie de se remettre à triturer, torturer, dépiauter les scripts, même lorsque l'on n'y connaît rien, ou très peu, rien ne vaut l'apprentissage sur le tas !

En ce qui concerne le script "robot", je dois être d'une nullité affligeante, j'ai testé les deux versions gracieusement proposées ici, je clique, je reclique, et je clique encore, mais la bestiole ne me suit pas. Nous avons un joli plan d'eau à l'Oasis, j'aurais bien aimé bidouiller une petite coquille de noix et tracer un itinéraire, mais jusqu'à présent, j'ai juste rageusement jeté une cinquante de cubes à la poubelle, ceux-ci refusant obstinément de faire ce que je leur demande.

Il y a peut-être des variables à inscrire directement dans le script, en fait, plus je lis, moins je comprends. c'est tout mon cerveau qui est à rescripter...


Bonne journée


Jeromine
Citation :
Publié par jeromine
Bonjour

Et encore une fois merci de faire partager ce savoir et par là-même, d'en éclabousser les autres. Disposer de certaines pistes donne envie de se remettre à triturer, torturer, dépiauter les scripts, même lorsque l'on n'y connaît rien, ou très peu, rien ne vaut l'apprentissage sur le tas !

En ce qui concerne le script "robot", je dois être d'une nullité affligeante, j'ai testé les deux versions gracieusement proposées ici, je clique, je reclique, et je clique encore, mais la bestiole ne me suit pas. Nous avons un joli plan d'eau à l'Oasis, j'aurais bien aimé bidouiller une petite coquille de noix et tracer un itinéraire, mais jusqu'à présent, j'ai juste rageusement jeté une cinquante de cubes à la poubelle, ceux-ci refusant obstinément de faire ce que je leur demande.

Il y a peut-être des variables à inscrire directement dans le script, en fait, plus je lis, moins je comprends. c'est tout mon cerveau qui est à rescripter...


Bonne journée


Jeromine
Non il y a rien à inscrire.

Je te propose que nous essayons ensemble le script in game, je te laisse un message.

Essaye sur une SIM no lag en attendant...
Citation :
Publié par Ryou Yiyuan
ahahaha vraiment amusant comme script. Lorsque j'avais encore l'Homestead m'aurais bien était utile pour faire des tours^^
Ah oui pas mal en effe M&Ms l'idée pour le travelling.
Comme l'idée semble plaire... je vais essayer de proposer un script "Travel Anywhere" permettant de coupler une clef USeB ( voir https://forums.jeuxonline.info/showthread.php?t=1025159 ) qui permettrait:

- soit d'enregistrer une looooooong parcours.
- soit plusieurs ( 5 max)
(et ne pas perdre les parcours en modifiant le script )

"Jouable" par un menu de sélection.

A suivre...
Un coup de BEGON cela va la calmer...


si vous voulez des jolis "glisser" du robot et être moins assujettis au lag

mettez les 3 paramètres suivants à:

Code PHP:

float   Rate 2
et

Code PHP:

 llMoveToTarget(pos,1);
 
llSleep (Rate/2); 
c'est fun....
Si vous avez quelques idées pour utiliser ce robot pour créer un objet parcourant un plan d'eau , un trajet au sol ou un petit tour dans les airs en montgolfière vous devez connaitre un peu comment marche le principe.

En effet un trajet en barque doit être soft , dans les airs très soft (inertie) au sol moins soft etc...

La technique utilisée (Best à donner le bon terme) est échantillonnage, très utilisée en électronique/informatique/industrie et mathématiques aussi.

Le principe ici est de prendre une valeur tous les x secondes.

Échantillonner à .2 s veut dire avoir 5 valeurs pour 1 seconde écoulée.

Dans le script j'ai mis .2 secondes pourquoi?

si un avatar marche à 1 m/s ( 5 positions/s )

positions tous les 1/5 = 20 cm un luxe! ( cela revient à échantillonner une fonction y = ax donc une droite...)

si un avatar court à 3 m/s on va prendre 3 positions 3 /5 = .6 m de précision


si un avatar vole à 5 m/s précision à 1 m etc....


donc en fonction de votre but régler "rate" à une valeur adaptée... pour produire l'effet recherché

float Rate = .2; <==


Une fois que les positions sont enregistrées vous pouvez les faire défiler à la même vitesse OU décider de ralentir le déplacement.

Cas de la montgolfière, ou le bateau.

llSleep (Rate*2); (2.5 déplacements / s)

L'autre paramètre à connaitre est celui ci :

llMoveToTarget(pos, ICI ); c'est le facteur d'amortissement pour s'arrêter ( en secondes)

(comme en voiture le temps de freinage plus il est court plus l'objet s'arrête brusquement plus il est long l'objet prend son temps pour s'arrêter cela peut donner un effet d'inertie dans les déplacements assez plaisant pour une Montgolfière ou une barque.

Voilà c'est tout
Master of the carpet
Pour pallier à certains carences du premier script (absence de rotations verticales) et introduire une architecture plus pro. Je vous présente le :

Master of the carpet


Un script à insérer dans une simple box et à compiler comme dab.

La box sera transformée ...en tapis volant équipé d'un petit moteur de... F16 (bridé à cause M Lag).
Citation :
Il vous permettra à l'aide de menus de:

- jouer au Master of the carpet ( voler)
- enregistrer un parcours
- de le mettre à disposition d'autres avatars autorisés sur votre terrain
Sous l'aspect fun c'est un produit sérieux, sous l'aspect sérieux c'est un produit ludique..

Carpet.png

Je ne vous explique pas le script...ce serait un peu...long

Just enjoy it and have fun...

Seb,


Code PHP:

// _________________________________________________
//
// Record & Travel
//
// Record your avatar pos & rot and replay them  
//
// By Sebastien Pfalz on September 2009 
//
// 
// _________________________________________________

// .: Constants :.//

string      PRODUCT     "Record & Travel"
string      VERSION     "V1.1";
string      SCRIPT_NAME "Recording & Traveling";
integer     MAX_RECORDS 1200;

integer     WAITING     0;
integer     RECORDING   1;
integer     TRAVELING   2;
integer     SETTINGS    3;
integer     PLAYING     4;

integer     PLAY_LOW    2;  
integer     REC_LOW     2;  
integer     PLAY_NORMAL 3;  
integer     REC_NORMAL  3;  
integer     PLAY_HIGH   5;  
integer     REC_HIGH    5;  
vector      CAM_OFFSET  = <-5.00.02.0>;
vector      CAM_ANG     = <0.00.02.0>;

vector      GREEN       = < 0.01.00.0 >;
vector      RED         = < 1.00.00.4 >;
vector      WHITE       = < 1.01.01.0 >;
float       ALPHA       1;
float       ROT_RAD     0;
list        
SIT_PARAMS  = [<-0.2,0.0,0.8>, <0.00.00.0>];


// .: Variables :.//

vector      Size        = <2.2,1.2,0.01>;
vector      Repeats     = < 1.00.91.0 >;
vector      Offsets      ZERO_VECTOR;
key         Rug_Texture =   "22aca67a-946a-fae7-448c-8da90265b34a";


key         Avatar_Siting;
integer     Listen_Handle;
integer     Channel1;
integer     Dialog_Channel
key         Owner;
integer     Status;
string      Number_Records;
list        
Pos_Rot;
vector      Origin_Pos;


list        
Travels     = ["Tour 1"];
string      Desc_Travels "1. Visit of the region";
string      Menu_Selected;

// Parameters record & play

float       Record_PosBySeconds 3;
float       Play_PosBySeconds 3;

// variable Motor

float   X_THRUST 20;
float   Z_THRUST 15;
float   xMotor;
float   zMotor;
integer Sit;


// .: Functions :.//
Play()
// move across the land with the pos & rot recorded before
integer     i;
vector      pos;
rotation    rot;    
    
    
llSetStatus(STATUS_PHYSICSTRUE); // set the object physical
    
    
Hover_Text " Travelling.."GREEN );
    
    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,1);
        
llRotLookAtrot 1);
        
llSleep (1.0/Play_PosBySeconds); // same that the recording but  can be different too
    
}
    
llSetStatus(STATUS_PHYSICSFALSE); // remove the status physical
    
llSetRotZERO_ROTATION);           // remove the last rotation
    
Hover_Text " End of the travel.."GREEN );
}

Record_Proc()
{
    
Pos_Rot = [];    
    
Origin_Pos llGetPos();
    
llSetTimerEvent 1/Record_PosBySeconds );
}

integer Channel(key uuid// Retourne un channel (integer)
{
    return (integer)(
"0x"llGetSubString((string)uuid,-8,-1)) + 5478// UUID + secure number 


Warp_Posvector destpos)  
{
 
// Compute the number of jumps necessary  
    
integer jumps = (integer)(llVecDist(destposllGetPos()) / 10.0) + 1;  
 
// Try and avoid stack/heap collisions  
    
if (jumps 100 )  
        
jumps 100;    //  1km should be plenty  
    
list rules = [ PRIM_POSITIONdestpos ];  //The start for the rules list  
    
integer count 1;  
    while ( ( 
count count << ) < jumps)  
        
rules = (rules=[]) + rules rules;   //should tighten memory use.  
    
llSetPrimitiveParamsrules llList2Listrules, (count jumps) << 1count) );  
}

Hover_Text string text vector color )
{
        
llSetText text ,color,1.0 ); // show the recording  
}
  
Init()
{
    
Owner llGetOwner(); 
    
llSetTimerEvent(0);
    
llSetSitText("Sit"); 
    
llSetStatus(STATUS_PHYSICSFALSE);
    
llSitTarget(llList2Vector(SIT_PARAMS,0),llList2Rot(SIT_PARAMS,1));
    
Status =   WAITING;
    
Hover_Text "Click to get the menu..."GREEN );
}

Build_Rug ()
{
    
llSetPrimitiveParams([  PRIM_SIZESize
                            
PRIM_FULLBRIGHTALL_SIDESTRUE
                            
PRIM_TEXTUREALL_SIDESRug_TextureRepeatsOffsetsROT_RAD,       
                            
PRIM_COLORALL_SIDESWHITEALPHA 
                        
]); 
    
llSetObjectName PRODUCT " " VERSION ); 
    
llSetObjectDesc "For JOL");
    if ( 
llGetScriptName() != SCRIPT_NAME )
        
llOwnerSay "Please the script the script inside " PRODUCT " " VERSION  " \n\t> " SCRIPT_NAME " <");   
}

default
{
    
on_rez(integer params)
    {
        
Build_Rug (); // noone knows... 
        
Init();
    }
    
    
state_entry()
    {
        if ( 
llGetObjectName () != (PRODUCT " " VERSION) )
            
Build_Rug();   
        
Init();
        
Dialog_Channel Channel(llGetKey()); 
        
Listen_Handle llListen(Dialog_Channel ,"""","");
    }
    
    
touch_start(integer total_number)
    {
        
llListen(Dialog_Channel,"",llGetOwner(),"");
        
        if ( 
llDetectedKey(0) ==  Owner)
        {     
            list 
buttons = ["Play","Record","Travel","Settings"];
            
llDialogllGetOwner(),"Please select...\n\n  ",buttonsDialog_Channel);
        }
        else
        {   
Menu_Selected "Travel";
            
llDialogllGetOwner(),"Please select... your travel\n\n" Desc_TravelsTravelsDialog_Channel);
        }
    }
    
    
listeninteger channelstring namekey idstring message )
    {
        if (
channel == Dialog_Channel )  
        {
            if ( 
message  == "Play" )
            {
                
Status PLAYING;
                
state Record;
            }
            if ( 
message  == "Record" )
            {
                
Menu_Selected "Record";
                
llDialogllGetOwner(),"Please select... the travel\n\n  ",TravelsDialog_Channel);
            }
            else if ( 
message  == "Settings" )
            {
                
Status SETTINGS
                
state Settings;            
            
            }
            else if ( 
message  == "Travel" )
            {
                
Menu_Selected "Travel";
                
llDialogllGetOwner(),"Please select... the travel\n\n  ",TravelsDialog_Channel);
            }
            
            else if ( !
llListFindListTravels, [message] ) && Menu_Selected == "Record")  
            {
                
Status RECORDING;
                
state Record;
            }
            else if ( !
llListFindListTravels, [message] ) && Menu_Selected == "Travel")  
            {
                
Status TRAVELING;
                
state Travel;      
            }             
        }
    }

}

state  Travel
{
    
on_rez(integer params)
    {
        
state default;
    }    
    
state_entry()
    {
        
Hover_Text " Sit to travel..."RED );
        
llSetSitText("Travel");
        
llSetCameraEyeOffset(CAM_OFFSET);
        
llSetCameraAtOffset(CAM_ANG);    
        
Dialog_Channel Channel(llGetKey()); 
        
Listen_Handle llListen(Dialog_Channel ,"""","");
    }
    
    
changed(integer change
    {                    
        if (
change CHANGED_LINK)     
        {    
            
Avatar_Siting llAvatarOnSitTarget();   
            if (
llAvatarOnSitTarget() != NULL_KEY
               
llRequestPermissions(Avatar_Siting,PERMISSION_TRIGGER_ANIMATION );

        }
    }
    
run_time_permissions(integer perms)
    {
        if(
perms)
        {
            
llStopAnimation("sit");
            
llStartAnimation("sit_ground");
            
Play();
            
llOwnerSay "End of the travel...");
            
llSleep(4);
            
llUnSit(Avatar_Siting);
            
state default;
        }
        else
            
llUnSit(Avatar_Siting);
    }
        
}


state  Settings
{
    
on_rez(integer params)
    {
        
state default;
    }      
    
    
state_entry()
    {
        
Init();
        
llListen(Dialog_Channel,"",llGetOwner(),"");
        list 
buttons = ["Low","Normal","High","OK"];
        
llDialogllGetOwner(),"Modify the parameters \n of resolution\n \nLow = 2 Positions/Second \nNormal = 3 Positions/Second \nHight = 5 Positions/Second   ",buttonsDialog_Channel);
    }
       
    
listeninteger channelstring namekey idstring message )
    {
        if (
channel == Dialog_Channel )  
        {
            if ( 
message  == "Low" )
            {
                
Play_PosBySeconds PLAY_LOW;  
                
Record_PosBySeconds REC_LOW;  
            }
            else if ( 
message  == "Normal" )
            {
                
Play_PosBySeconds PLAY_NORMAL;  
                
Record_PosBySeconds REC_NORMAL;  
            }
            else if (
message  == "High" )
            {
                
Play_PosBySeconds PLAY_HIGH;  
                
Record_PosBySeconds =REC_HIGH;  
            }
            else if ( 
message  == "OK" )
                
state default;                  
            
            list 
buttons = ["Low","Normal","High","OK"];
            
llDialogllGetOwner(),"Modify the parameters \n of resolution\n    \nLow = 2 Positions/Second \nNormal = 3 Positions/Second 
                                                                                \nHigh = 5 Positions/Second   "
,buttonsDialog_Channel);       
        
        }

    }
}

state Record
{
    
on_rez(integer params)
    {
        
state default;
    }  
    
    
    
state_entry() 
    {        
 
        if ( 
Status == PLAYING)
        { 
            
Origin_Pos llGetPos();             
            
llSetSitText("Play!");
            
Hover_Text " Sit to start playing..."RED );
        }
        else
        {
            
llSetSitText("Record");
            
Hover_Text " Sit to start recording..."RED );    
        }
   

        
llListen(Dialog_Channel,"",llGetOwner(),"");
        
        
llSetCameraEyeOffset(CAM_OFFSET);
        
llSetCameraAtOffset(CAM_ANG);
 
        
//SET VEHICLE PARAMETERS
        
llSetVehicleType(VEHICLE_TYPE_AIRPLANE);
 
        
llSetVehicleVectorParamVEHICLE_LINEAR_FRICTION_TIMESCALE, <2002020> );
 
        
// uniform angular friction 
        
llSetVehicleFloatParamVEHICLE_ANGULAR_FRICTION_TIMESCALE);
 
        
// linear motor
        
llSetVehicleVectorParamVEHICLE_LINEAR_MOTOR_DIRECTION, <000> );
        
llSetVehicleFloatParamVEHICLE_LINEAR_MOTOR_TIMESCALE);
        
llSetVehicleFloatParamVEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE120 );
 
        
// agular motor
        
llSetVehicleVectorParamVEHICLE_ANGULAR_MOTOR_DIRECTION, <000> );
        
llSetVehicleFloatParamVEHICLE_ANGULAR_MOTOR_TIMESCALE); 
        
llSetVehicleFloatParamVEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE.4);
 
        
// hover 
        
llSetVehicleFloatParamVEHICLE_HOVER_HEIGHT);
        
llSetVehicleFloatParamVEHICLE_HOVER_EFFICIENCY); 
        
llSetVehicleFloatParamVEHICLE_HOVER_TIMESCALE10000 );
        
llSetVehicleFloatParamVEHICLE_BUOYANCY0.977 );
 
        
// no linear deflection 
        
llSetVehicleFloatParamVEHICLE_LINEAR_DEFLECTION_EFFICIENCY);
        
llSetVehicleFloatParamVEHICLE_LINEAR_DEFLECTION_TIMESCALE); 
 
        
// no angular deflection 
        
llSetVehicleFloatParamVEHICLE_ANGULAR_DEFLECTION_EFFICIENCY0);
        
llSetVehicleFloatParamVEHICLE_ANGULAR_DEFLECTION_TIMESCALE5);
 
        
// no vertical attractor 
        
llSetVehicleFloatParamVEHICLE_VERTICAL_ATTRACTION_EFFICIENCY);
        
llSetVehicleFloatParamVEHICLE_VERTICAL_ATTRACTION_TIMESCALE);
 
        
// banking
        
llSetVehicleFloatParamVEHICLE_BANKING_EFFICIENCY1);
        
llSetVehicleFloatParamVEHICLE_BANKING_MIX.5);
        
llSetVehicleFloatParamVEHICLE_BANKING_TIMESCALE0.01);
 
        
// default rotation of local frame
        
llSetVehicleRotationParamVEHICLE_REFERENCE_FRAME, <0,0,0,1>);
 
        
// remove these flags 
        
llRemoveVehicleFlagsVEHICLE_FLAG_NO_DEFLECTION_UP 
                              
VEHICLE_FLAG_HOVER_WATER_ONLY
                              
VEHICLE_FLAG_LIMIT_ROLL_ONLY 
                              
VEHICLE_FLAG_HOVER_TERRAIN_ONLY 
                              
VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT 
                              
VEHICLE_FLAG_HOVER_UP_ONLY 
                              
VEHICLE_FLAG_LIMIT_MOTOR_UP );
    
 
        


    }
    
    
touch_start(integer total_number)
    {  
        
llDialogllGetOwner(),"\n Stop the recording...",["STOP"], Dialog_Channel);         
    } 
    
    
listeninteger channelstring namekey idstring message )
    {
        if (
channel == Dialog_Channel &&  message  == "STOP" 
        { 
            
llSetTimerEvent (0);
            if ( 
Status == PLAYING)
                
Hover_Text ";-) It was fun thanks!"GREEN );
            else
                
Hover_Text " Stopped " Number_Records " positions recorded "RED );
            
            
llSleep (5);
            
state default;
        }
    }
    
// DETECT AV SITTING/UNSITTING AND GIVE PERMISSIONS
    
changed(integer change)
    {
       
Avatar_Siting llAvatarOnSitTarget();
       if(
change CHANGED_LINK)
       {
           if((
Avatar_Siting == NULL_KEY) && (Sit))
           {
//  Avatar gets off vehicle 
               
llSetStatus(STATUS_PHYSICSFALSE);
                
Warp_Pos(Origin_Pos); // long deplacement.....
               
llStopAnimation("sit_ground");
                
llReleaseControls();
                
Sit FALSE;
                
llSetTimerEvent (0);
                
Hover_Text " Stopped " Number_Records " positions recorded "RED );
                
state default;
           }
           else if ((
Avatar_Siting == Owner) && (!Sit))
           { 
// Avatar gets on vehicle
                
llSetStatus(STATUS_PHYSICSTRUE);
                
Sit TRUE

                
llRequestPermissions(Avatar_SitingPERMISSION_TAKE_CONTROLS PERMISSION_TRIGGER_ANIMATION);
           } 
           else if (
Avatar_Siting != Owner
            
llUnSit(Avatar_Siting);
       }
    }
 
 
           
//CHECK PERMISSIONS AND TAKE CONTROLS
            
run_time_permissions(integer perm
            {
                if ( 
Status == RECORDING
                    
Record_Proc();
                else
                    
Hover_Text " To stop... Click and STOP.  "RED );                
                
                if (
perm & (PERMISSION_TAKE_CONTROLS)) 
                {      
                    
llTakeControlsCONTROL_UP|CONTROL_DOWN|CONTROL_FWD|CONTROL_BACK|CONTROL_RIGHT|
                                    
CONTROL_LEFT|CONTROL_ROT_RIGHT|CONTROL_ROT_LEFT,
                                    
TRUE,FALSE);
                }
                if (
perm PERMISSION_TRIGGER_ANIMATION)
                {
                    
// Admittedly, animations are bugged. I'll let you figure it out. :) -CT
                    
llStartAnimation("sit_ground");
                    
llStopAnimation("sit");
                }
            }
 
    
//FLIGHT CONTROLS     
    
control(key idinteger levelinteger edge
    {
            
vector angular_motor
            
integer motor_changed;
            if ((
level CONTROL_FWD) || (level CONTROL_BACK))
            {
                if (
edge CONTROL_FWDxMotor X_THRUST;
                if (
edge CONTROL_BACKxMotor = -X_THRUST;
            } 
            else
                
xMotor 0;

            if ((
level CONTROL_UP) || (level CONTROL_DOWN))
            {
                if (
level CONTROL_UP
                    
zMotor Z_THRUST;
                else if (
level CONTROL_DOWN
                    
zMotor = -Z_THRUST;
            }
            else
                
zMotor 0;
                

            
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <xMotor,0,zMotor>);
 
 
            if (
level CONTROL_RIGHT){
                
angular_motor.3*PI;
                
angular_motor./= 8;
            }   
            
            else if (
level CONTROL_LEFT) {
                
angular_motor.= -3*PI;
                
angular_motor./= 8;
            }
 
            else if (
level CONTROL_ROT_RIGHT) {            
                
angular_motor.TWO_PI
                
angular_motor./= 8;
            }
 
            else if (
level CONTROL_ROT_LEFT) {
                
angular_motor.= -TWO_PI
                
angular_motor./= 8;
            }

            
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTIONangular_motor);
    } 
    
    
timer()
    {
        
integer list_length llGetListLength(Pos_Rot);
        
        if ( 
llGetFreeMemory() < 500 ||  list_length == MAX_RECORDS )
        {
            
llOwnerSay "The memory of this script is almost full...We must stop the recording and come back!");
            
llSetStatus(STATUS_PHYSICS,FALSE);
            
Warp_Pos(Origin_Pos); // long deplacement.....
            
state default;
        }
        
Pos_Rot += llGetObjectDetails(Owner, [ OBJECT_POSOBJECT_ROT]);
        
Number_Records = (string) list_length;
        
integer memory_used =    llRound((list_length*1.0/MAX_RECORDS)*100);   
        if ( 
memory_used 90 )
            
Hover_Text Number_Records " positions stored in list\n" + (string) memory_used "% memory used"GREEN );
        else 
            
Hover_Text Number_Records " positions stored in list\n" + (string) memory_used "% memory used"RED );

    }   


Répondre

Connectés sur ce fil

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