Martedì 20 Maggio 2008
Lezione su come scriptare il movimento
0. Rotazione client (llTargetOmega)
1. Rotazione server (llSetRot)
2. Uso di llSetPos (attenzione al limite 10 m)
3. Esempio di vagone che si muove
0. Vi sono tanti modi per far muovere un oggetto da scripting.
La cosa più semplice è di farlo ruotare.
Per la rotazione ci sono due sistemi:
- rotazione client
- rotazione server
La prima è la più "dolce" perchè lo spostamento viene fatto dal client. Produce meno lag sul server.
Per avere un esempio costruite il seguente script
default
{
state_entry()
{
llTargetOmega(<0,0,1>, PI/4, 0.01);
}
}
"Omega" è il termine fisico per indicare una rotazione.
llTargetOmega(vector asse, float velocità, float forza);
"asse" indica lungo quale asse ruotare <0,0,1> vuol dire ruotare sull'asse z, che è quello che va vero l'alto.
"velocità" indica la velocità in radianti per secondo. PI/4 radianti vuol dire 45 gradi al secondo o anche 8 secondi per una rotazione completa. 2*PI vuol dire una rotazione per secondo.
Se velocità è positiva => rotazione antioraria, altrimenti rotazione oraria.
forza è usato solo per gli oggetti fisici, ma deve comunque essere > 0 per fare la rotazione per oggetti non fisici.
L'uso di llTargetOmega è preferibile perchè il suo effetto in termine di lag pesa solo sui client e non sul server.
1. Rotazione Server
vector vROT=<0,0,0>;
default
{
state_entry()
{
llSetTimerEvent(0.1); // lancia un evento dopo 0.1 secondi (immediatamente)
}
timer()
{
vROT+=<0,0,PI/4/10>;
llSetRot(llEuler2Rot(vROT));
}
}
Questo script è analogo al precedente, ma la rotazione viene fatta lato server. Fatta su un oggetto non fisico lo spostame è "a scatti" meno fluido del precedente, ma potete controllare con esattezza la rotazione dell'oggetto.
Con il metodo precedente NON è possibile sapere in un detereminato momento quale rotazione ha l'oggetto.
Difetti, oltre al già citato movimento a scatti, il vostro cubo potrebbe muoversi in modo intermittente e se c'è lag potrebbe fermarsi temporaneamente per alcuni attimi.
2. Movimento lineare (llSetPos) avanti-indietro
vector vDELTA=<0,0,.2>; // spostamento ogni 2 decimi di secondo
float fMAX=5; // distanza massima dalla posizione originale
vector vSTARTPOS;
default
{
state_entry()
{
vSTARTPOS=llGetPos();
llSetTimerEvent(0.2);
}
timer()
{
if(llVecDist(llGetPos(),vSTARTPOS) > fMAX)
{
vDELTA=-vDELTA;
}
llSetPos(llGetPos()+vDELTA);
}
}
3. Combinazione dei due movimenti.
Lo script seguente fa ruotare e muovere una struttura linkata. Combinazione degli script precedenti:
vector vDELTA=<0.1,0.1,0>; // spostamento ogni 2 decimi di secondo
float fMAX=.5; // distanza massima dalla posizione originale
vector vSTARTPOS;
float fRATE=0;
float fRATEDELTA;
default
{
state_entry()
{
fRATEDELTA=PI/8;
vSTARTPOS=llGetPos();
llSetTimerEvent(0.2);
}
timer()
{
fRATE+=fRATEDELTA;
if(fRATE>PI/4) fRATEDELTA=-fRATEDELTA;
llTargetOmega(<0,0,1>,fRATE,1);
if(llVecDist(llGetPos(),vSTARTPOS) > fMAX)
{
vDELTA=-vDELTA;
}
llSetPos(llGetPos()+vDELTA);
}
}
Comments