il y a t'il un connaisseur en papillon?

Répondre
Partager Rechercher
Alors voila , je suis à la recherche d'un script que je pourrai placer à l'interieur d'un papillon sculpté pour juste le faire voler avec une faible envergure de façon à ce qu'il tienne dans une boule..un mouvement assez simple , même juste monter et descendre mais que je puisse le canaliser dans une boule transparente.
une idée mesdames messieurs les génies du script?
merci de votre aide
je suis ne pas vraiment expert en animation
voici ma suggestion, je serais très content si qqn pouvait répondre mieux parce qu'il y a des différentes d'animation entre objet physique et non physique

et il me semble que les animations non physiques sont assez saccadée malheureusement c'est les seules que je connais

tout d'abord il va y avoir l'animation des ailes ça devrait être assez simple un script qui gère les 2 ailes en synchro, un changement de rotation devrait suffir je pense avec un petit llSleep pour donner un effet réel

ensuite pour le faire tourner dans une place il y a la commande llSetPos qui te permet de définir la position...
L'idée serait de lui définir une liste de déplacements sous forme de vecteur <x,y,z>
<+.2, -.2, -.1>
<+.4, -3, -1> (j'ai mis n'importe quoi)

Ensuite au rez tu enregistre la position actuelle (llGetPos()) puis tu passes en revue ton tableau de vecteur et tu fais des llSetPos(llGetPos() + <vecteur))

Si tu définis bien ta liste de vecteur normalement ton papillon devrait pouvoir tourner en boucle n'importe ou...

Si qqn à qqch de mieux je suis preneur ça m'intéresse.
Merci de ton temps accordé pour cette réponse Arthur
Je vais devoir bien étudié tout ce que tu viens de me dire car n'y connaissant pas grand chose ( hummm ok rien ) en script tout cela me parait assez compliqué mais j'y arriverai
Citation :
Publié par joyfellini
Merci de ton temps accordé pour cette réponse Arthur
Je vais devoir bien étudié tout ce que tu viens de me dire car n'y connaissant pas grand chose ( hummm ok rien ) en script tout cela me parait assez compliqué mais j'y arriverai

attend peut-etre la réponse d'un 'expert' par ce que je ne sais vraiment pas si ma solution est la meilleure. moi je te donne celle là parce que si j'avais ce problème à résoudre je ferais ça

avec les objets physiques tu peux envoyer des impulsions je crois ce qui donne quelque chose de plus fluide

peut-être fait des essais dans une bête prim avant
tu fais une prim tu créé un script
au sommet de ton script tu déclares la liste des vecteurs de déplacement
list lMove = [<-.2, -.1, 0>, <0.4, -.1, -.05>, ...];

dans le state entry tu rajoutes un code du genre (pas testé, enlève les accents des commentaires peutetre)

Code:
integer i;
for (i = 0; i < llGetListLength(lMove); i++)
{
    // extrait ma position actuelle
    vector vMyPos = llGetPos();
    // extrait le déplacement
    vector vMove = llList2Vector(lMove, i);
    // additionne les 2 vecteurs et positionne la prim
    llSetPos(vMyPos + vMove);
    // temps d'attente entre les déplacements en secondes
    llSleep(.3);
}
Ensuite si tu veux rendre la chose infinie
tu englobes le codes ci-dessus par
Code:
while (5 < 7)
{
    le code ci dessus
}
A essayer...dis moi ;-)
Merci Arthur, dés que possible j'essaie tout cela !!!!!

Coucou Biou !!!!!
Et si c'est pour de la revente puisque cela fera partie d'une robe
Je vais regarder les liens que tu m'as donné, merci beaucoup !!!!!!
Un papillon a des mouvements saccadés donc pas besoin de passer en physique. Je vois bien des ailes flex qui battent naturellement. Je te propose une procédure pour encoder des translations et rotations successives. C'est un peu laborieux mais efficace. J'ai codé ça rapidement sans chercher à optimiser le code mais j'ai fait un petit test et ça marche.

Tu dois connaître au départ le nombre de positions que tu veux. Tu mets dans ton papillon le script suivant en renseignant la variable n avec le nombre de positions. Par défaut j'ai mis 3.

Code:
// Nombre de positions
integer n = 3;
// Variables
integer index;
vector initPos;
rotation initRot;
vector pos;
rotation rot;
default
{
 state_entry()
 {
  llOwnerSay("Mettez moi dans la première position et cliquez sur moi");
 }
 touch_start(integer total_number)
 {
  if(index == 0) {
   initPos = llGetPos();
   initRot = llGetRot();
   pos = llGetPos();
   rot = llGetRot();
   index++;
   llOwnerSay("Mettez moi dans la position 2 et cliquez sur moi");
  }
  else if(index == n - 1)
  {
   vector diffPos = llGetPos() - pos;
   rotation diffRot = llGetRot() / rot;
   llOwnerSay((string)diffPos);
   llOwnerSay((string)diffRot);
   diffPos = initPos - llGetPos();
   diffRot = initRot / llGetRot();
   llOwnerSay((string)diffPos);
   llOwnerSay((string)diffRot);
   llOwnerSay("C'est terminé, supprimez ce script et mettez le suivant");
  }
  else
  {
   vector diffPos = llGetPos() - pos;
   rotation diffRot = llGetRot() / rot;
   llOwnerSay((string)diffPos);
   llOwnerSay((string)diffRot);
   pos = llGetPos();
   rot = llGetRot();
   index++;
   llOwnerSay("Mettez moi dans la position " + (string)(index + 1) + " et cliquez sur moi");
  }
 }
}
Le script va te donner des instructions et afficher des valeurs de position et rotation à mesure. En gros tu positionnes ton papillon dans les lieux successifs, tu cliques sur le papillon et ça te donne dans le Chat la translation et la rotation correspondant au déplacement. Par exemple :

[9:18] Object: <0.00000, 0.00000, 0.92795>
[9:18] Object: <0.00000, 0.00000, 0.38268, 0.92388>

La première valeur est la translation et la deuxième la rotation. Quand tu as toutes tes valeurs tu supprime le premier script et tu mets le suivant mais en mettant tes coordonnées dans la liste :

Code:
// Coordonnées
list l = [<0.00000, 0.00000, 0.92795>,<0.00000, 0.00000, 0.38268, 0.92388>,
 <0.00000, 0.77836, 0.00000>,<0.27060, -0.27060, 0.00000, 0.92388>,
 <0.00000, -0.77836, -0.92795>,<-0.35355, 0.14645, -0.35355, 0.85355>];
// Délai
float del = .4;
// Variables
integer index;
default
{
 state_entry()
 {
  integer n = llGetListLength(l);
  vector pos;
  rotation rot;
  while(TRUE)
  {
   pos = llGetPos() + llList2Vector(l, index);
   rot = llList2Rot(l, index) * llGetRot();
   llSetPrimitiveParams([PRIM_POSITION, pos, PRIM_ROTATION, rot]);
   if(++index == n) index = 0;
  }
 }
}
Tu entres les coordonnées dans l'ordre que tu les as reçues avec le premier script. Chaque fois translation puis rotation et toujours avec des virgules pour séparer.

Tu peux aussi régler la variable del qui est le délai entre deux positions en secondes. J'ai mis à 0,4 seconde, le délai minimal est de 0,2 seconde, ce qui donne un papillon un peu frénétique je pense.

Tu n'as plus qu'à admirer ton papillon se dandiner

Evidemment cette procédure n'est pas limitée aux papillon
Petite reprise de mon script précédent. C'est mon jour de bonté j'ai amélioré le premier script de définition des positions pour faire apparaître dans le Chat en clair la ligne de code complète :

Code:
// Nombre de positions
integer n = 3;
// Variables
integer index;
vector initPos;
rotation initRot;
vector pos;
rotation rot;
list l;
affiche()
{
 string s = "\nlist l = [";
 integer n = llGetListLength(l);
 integer c;
 for(c = 0; c < n; c++)
  s += llList2String(l, c) + ",";
 s = llGetSubString(s, 0, -2) + "];";
 llOwnerSay(s);
}
default
{
 state_entry()
 {
  llOwnerSay("Mettez moi dans la première position et cliquez sur moi");
 }
 touch_start(integer total_number)
 {
  if(index == 0) {
   l = [];
   initPos = llGetPos();
   initRot = llGetRot();
   pos = llGetPos();
   rot = llGetRot();
   index++;
   llOwnerSay("Mettez moi dans la position 2 et cliquez sur moi");
  }
  else if(index == n - 1)
  {
   vector diffPos = llGetPos() - pos;
   rotation diffRot = llGetRot() / rot;
   l += [diffPos,diffRot];
   diffPos = initPos - llGetPos();
   diffRot = initRot / llGetRot();
   l += [diffPos,diffRot];
   llOwnerSay("C'est terminé, copiez ce qui suit dans le deuxième script");
   affiche();
  }
  else
  {
   vector diffPos = llGetPos() - pos;
   rotation diffRot = llGetRot() / rot;
   l += [diffPos,diffRot];
   pos = llGetPos();
   rot = llGetRot();
   index++;
   llOwnerSay("Mettez moi dans la position " + (string)(index + 1) + " et cliquez sur moi");
  }
 }
}
Comme ça le copier-coller devient très facile. On pourrait encore bien améliorer tout ça, ça reste très artisanal
Répondre

Connectés sur ce fil

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