Advertisement
salahzar

SLVEC Lezione di script sul movimento 18052008

Feb 16th, 2020
433
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1.  
  2.  
  3. Martedì 20 Maggio 2008
  4. Lezione su come scriptare il movimento
  5.  
  6.  
  7. 0. Rotazione client (llTargetOmega)
  8. 1. Rotazione server (llSetRot)
  9. 2. Uso di llSetPos (attenzione al limite 10 m)
  10. 3. Esempio di vagone che si muove
  11.  
  12.  
  13.  
  14. 0. Vi sono tanti modi per far muovere un oggetto da scripting.
  15. La cosa più semplice è di farlo ruotare.
  16. Per la rotazione ci sono due sistemi:
  17.  
  18. - rotazione client
  19. - rotazione server
  20.  
  21. La prima è la più "dolce" perchè lo spostamento viene fatto dal client. Produce meno lag sul server.
  22.  
  23. Per avere un esempio costruite il seguente script
  24.  
  25. default
  26. {
  27. state_entry()
  28. {
  29. llTargetOmega(<0,0,1>, PI/4, 0.01);
  30. }
  31. }
  32.  
  33. "Omega" è il termine fisico per indicare una rotazione.
  34.  
  35. llTargetOmega(vector asse, float velocità, float forza);
  36.  
  37. "asse" indica lungo quale asse ruotare <0,0,1> vuol dire ruotare sull'asse z, che è quello che va vero l'alto.
  38.  
  39. "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.
  40.  
  41. Se velocità è positiva => rotazione antioraria, altrimenti rotazione oraria.
  42.  
  43. forza è usato solo per gli oggetti fisici, ma deve comunque essere > 0 per fare la rotazione per oggetti non fisici.
  44.  
  45. L'uso di llTargetOmega è preferibile perchè il suo effetto in termine di lag pesa solo sui client e non sul server.
  46.  
  47. 1. Rotazione Server
  48.  
  49. vector vROT=<0,0,0>;
  50.  
  51. default
  52. {
  53. state_entry()
  54. {
  55. llSetTimerEvent(0.1); // lancia un evento dopo 0.1 secondi (immediatamente)
  56. }
  57. timer()
  58. {
  59. vROT+=<0,0,PI/4/10>;
  60. llSetRot(llEuler2Rot(vROT));
  61. }
  62. }
  63.  
  64. 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.
  65. Con il metodo precedente NON è possibile sapere in un detereminato momento quale rotazione ha l'oggetto.
  66. 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.
  67.  
  68.  
  69. 2. Movimento lineare (llSetPos) avanti-indietro
  70.  
  71. vector vDELTA=<0,0,.2>; // spostamento ogni 2 decimi di secondo
  72. float fMAX=5; // distanza massima dalla posizione originale
  73. vector vSTARTPOS;
  74.  
  75. default
  76. {
  77. state_entry()
  78. {
  79. vSTARTPOS=llGetPos();
  80. llSetTimerEvent(0.2);
  81. }
  82. timer()
  83. {
  84. if(llVecDist(llGetPos(),vSTARTPOS) > fMAX)
  85. {
  86. vDELTA=-vDELTA;
  87. }
  88. llSetPos(llGetPos()+vDELTA);
  89. }
  90. }
  91.  
  92.  
  93. 3. Combinazione dei due movimenti.
  94.  
  95. Lo script seguente fa ruotare e muovere una struttura linkata. Combinazione degli script precedenti:
  96.  
  97. vector vDELTA=<0.1,0.1,0>; // spostamento ogni 2 decimi di secondo
  98. float fMAX=.5; // distanza massima dalla posizione originale
  99. vector vSTARTPOS;
  100. float fRATE=0;
  101. float fRATEDELTA;
  102.  
  103. default
  104. {
  105. state_entry()
  106. {
  107. fRATEDELTA=PI/8;
  108. vSTARTPOS=llGetPos();
  109. llSetTimerEvent(0.2);
  110. }
  111. timer()
  112. {
  113. fRATE+=fRATEDELTA;
  114. if(fRATE>PI/4) fRATEDELTA=-fRATEDELTA;
  115.  
  116. llTargetOmega(<0,0,1>,fRATE,1);
  117. if(llVecDist(llGetPos(),vSTARTPOS) > fMAX)
  118. {
  119. vDELTA=-vDELTA;
  120. }
  121. llSetPos(llGetPos()+vDELTA);
  122. }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement