Formule déroulement type poster

Formule déroulement type poster - Algo - Programmation

Marsh Posté le 18-10-2012 à 23:08:25    

Bonsoir :hello:

 

Je cherche à faire une anim par code de "déroulement de poster" (une ligne qui s'enroule)

 

J'ai fini par pondre un code qui marche, mais je voudrais pouvoir l'optimiser :

 
Code :
  1. float px=0.f;
  2.             float py=0.f;
  3.             for (int i=0;i<=100;i++)
  4.             {
  5.                 float xF = float(i)/100.f;
  6.                 float R=1.0f;
  7.                 float a=0.0f;
  8.                 if (xF>l)
  9.                 R=(1.0-(xF-l));
  10.                 if (xF>l)
  11.                     a=(M_PI*2.f * 7.f)*(l-xF); // Une fois enroulée, ma ligne fera 7 tours sur elle-même
  12.  
  13.                 px+=cos(a)*R/100.f;
  14.                 py+=sin(a)*R/100.f;
  15.                // Je me retrouve avec la position finale de mon point dans l'interval [0,1]
  16.             }
 

'l' c'est la valeur d'enroulement, si c'est égale à 0 la ligne est enroulé, si c'est égale à 1 c'est déroulé.

 

Le code fonctionne bien, le soucis c'est que j'incrémente les valeurs px/py. Or ce code est destiné à manipuler des vertices en GLSL, et pour l'appliquer je dois recalculer la position de chaque point en ré-utilisant la position de tous les anciens.. c'est pas très propre :D

 

Au final, je cherche à avoir exactement le même résultat, mais sans avoir à incrémenter px et py (donc sans avoir à connaître la position des points précédent), quelqu'un aurait une idée ? (Je suis pas terrible terrible en math :D)

 

Merci à vous :jap:

 

edit : Si jamais je ne me fait pas comprendre, je peux toujours poster un gif pour monter :D


Message édité par Terminapor le 18-10-2012 à 23:39:08

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 18-10-2012 à 23:08:25   

Reply

Marsh Posté le 19-10-2012 à 00:42:36    

Bonsoir,
 
ligne 10 et 13 jamais vérifiée?
a constant du coup?
 
px = i*1.0*1.0f/100.f;
py = i*0.0*1.0f/100.f;
 
ou j'ai raté quelque chose? (ou tu a mal copié une condition?)


---------------
Seul Google le sait...
Reply

Marsh Posté le 19-10-2012 à 08:32:40    

Si, l varie en fonction du temps, comme ça :

 
Code :
  1. l = clamp(0.0,Frame/240.f,1.0f);
 

Et Frame est incrémentée à chaque fin de boucle principale.

 

edit : J'ai pas précisé, mais le code de mon 1er mon poste est entre un glBegin(GL_POINTS); glEnd(). A chaque pas de i, je dessine un point aux coordonnées px,py :D


Message édité par Terminapor le 19-10-2012 à 08:41:21

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 19-10-2012 à 11:31:35    

Oui mais 'l' n'intervient que dans une condition (l10 et 13) qui n'est jamais vérifiée tel que tu présentes ton code?


---------------
Seul Google le sait...
Reply

Marsh Posté le 19-10-2012 à 15:09:21    

Non, j'ai pas mis le code en entier.
 
En gros, ça donne ça en entier (j'omet quand même certaines parties inutiles, comme l'initialisation de GL /la gestion d'io pour arrêter le programme,etc)
Le mode de projection est orthonormal (en gros, la composante Z représente le calque du vertex)
 

Code :
  1. int Frame=0;
  2. while (1)
  3. {
  4.   float l = clamp(0.0,float(Frame)/240.f,1.0);
  5.   float px,py;
  6.   glBegin(GL_POINTS);
  7.   for (int i=0;i<=100;i++)
  8.   {
  9.       float xF = float(i)/100.f;
  10.       float R = 1.0f;
  11.       float A = 0.0f;
  12.      if (xF >l)
  13.      {
  14.            R = (1.0f - (xF-l));
  15.            a = (M_PI * 2.0f * 7.f)*(l-xF);
  16.      }
  17.      px+=cos(a)*R/100.f;
  18.      py+=sin(a)*R/100.f;
  19.     glVertex3f(px*100.f + 60.f,py*100.f + 60.f,i);
  20.    
  21.   }
  22.   glEnd();
  23.   Frame++;
  24.   sleep(16); // On limite à 60FPS
  25.  
  26. }


 
Donc je cherche à avoir le même résultat, sans avoir à incrémenter px et py (Auquel cas je dois recalculer la position d'un point en fonction des anciens)


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 19-10-2012 à 16:28:12    

xF n'est JAMAIS > 1
ligne 15-19 ne servent a rien...
du coup a et R sont fixes....

Erf j'ai compris, c'est pas 1 c'est l (L) désolé!


Message édité par breizhbugs le 19-10-2012 à 16:29:26

---------------
Seul Google le sait...
Reply

Marsh Posté le 19-10-2012 à 16:32:55    

Ah, oui forcément :D
 
Du coups, une idée ? :D


---------------
Perhaps you don't deserve to breathe
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed