Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement