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.
// 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 :
// 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