[c++][OpenGL] Comment modéliser une maille ?

Comment modéliser une maille ? [c++][OpenGL] - C++ - Programmation

Marsh Posté le 19-03-2007 à 12:57:34    

Bonjour à tous et à toutes,
 
Je souhaite dans le cadre d’un projet de robotique, modéliser une maille de nœuds qui seraient reliés les uns aux autres par un lien « ressort, amortisseur ».
En fait le lien n’est pas important pour l’instant, ce que je voudrais, c’est savoir comment partir lorsque l’on souhaite modéliser une maille, afin de partir sur de bonnes bases.
Par exemple, vaut t-‘il mieux utiliser des triangles ou des carrés ou je ne sais quoi ? … comment ça va se passer si je veux rajouter une texture par la suite ? …
 
Je code en c++, qui est un nouveau langage pour moi, mais je pense men sortir de ce coté la. Pour la partie graphique, j’utilise opengl.
Pour ceux qui se posent la question de l’utilité de cette maille : elle servira à représenter la peau humaine (en fait il y aura 5 mailles superposées avec des propriétés différentes), et elle devra réagir en fonction de la force qu’on lui appliquera par l’intermédiaire d’un périphérique haptique.
 
Ne vous inquiétez pas, Je ne souhaite pas une réponse toute faite pour me mâcher le travail, mais plutôt des conseils, ou une sorte de plan pour bien démarrer.
 
Merci d’avance.

Reply

Marsh Posté le 19-03-2007 à 12:57:34   

Reply

Marsh Posté le 19-03-2007 à 14:10:49    

http://freespace.virgin.net/hugo.e [...] string.htm
http://freespace.virgin.net/hugo.e [...] _cloth.htm
 
et si tu est disposé a nous presenter les resultats (et non un merci-> ca marche/aurevoir) je suis pret a t'aider.

Reply

Marsh Posté le 20-03-2007 à 03:46:31    

Salut Red faction, c'est ce genre de lien qu'il me fallait, j'aime le fait de pouvoir attaquer par une simple chaine avant d'enchainer sur la maille.
 
Bien sur je veux bien présenter mes résultats et avancées, mais pour l'instant je pars de zéro ^^
 
J'actualiserai ce topic quand j'aurai un bout de code qui tourne.
 
Merci

Reply

Marsh Posté le 20-03-2007 à 09:34:48    

Dans le même genre, en simple:
http://nehe.gamedev.net/data/lesso [...] ?lesson=40
 
(rope physics)


---------------
Töp of the plöp
Reply

Marsh Posté le 21-03-2007 à 04:15:48    

en simple ...
C'est vite dit, en tout cas pas pour moi ;-)
 
Merci en tt cas

Reply

Marsh Posté le 21-03-2007 à 09:40:06    

ok, en plus simple alors ;)


Message édité par _darkalt3_ le 21-03-2007 à 09:40:14

---------------
Töp of the plöp
Reply

Marsh Posté le 22-03-2007 à 04:35:31    

En moins compliqué ça correspond encore mieux  :p  
 
Donc j'ai commencé en utilisant le 1er lien de Red Faction pour réaliser une string : [url]http://freespace.virgin.net/hugo.e [...] string.htm[/url].
Seulement il n'y a que l'algorithme et pas le langage c++.
 
Voici ce que j'ai tenté (partie sans la masse pour l'instant) :
 

Code :
  1. #include <iostream>
  2. #include <math.h>
  3. using namespace std;
  4. int main()
  5. {
  6.    // on crée les tableaux et déclare les variables :
  7. double string1_X[32];
  8. double string1_Y[32];
  9. double string2_X[32];
  10. double string2_Y[32];
  11. double X_Vector1 = 0;
  12. double Y_Vector1 = 0;
  13. double X_Vector2 = 0;
  14. double Y_Vector2 = 0;
  15. double Magnitude1 = 0;
  16. double Magnitude2 = 0;
  17. double Extension1 = 0;
  18. double Extension2 = 0;
  19. double xv = 0;
  20. double yv = 0;
  21. double longueur_normale = 1;
  22. double Gravity=0;
  23. // on les initialise :
  24. int i=0;
  25. for (i=0; i<32; i++)
  26. {
  27. string1_X[i]=0;
  28. string1_Y[i]=i;
  29. }
  30. int j=0;
  31. while(j<3)
  32. {
  33. cout << "Boucle n°" << j << ":" << endl;
  34. for (i=0; i<32; i++)
  35.  {
  36.  X_Vector1 = string1_X[i- 1] - string1_X[i];
  37.  Y_Vector1 = string1_Y[i - 1] - string1_Y[i];
  38.         Magnitude1 = sqrt((X_Vector1*X_Vector1) +  (Y_Vector1*Y_Vector1));
  39.         Extension1 = Magnitude1 - longueur_normale;
  40.  cout << "Magnitude 1 :" << Magnitude1 << endl;
  41.  cout << "Extension 1 :" << Extension1 << endl;
  42.         X_Vector2 = string1_X[i + 1] - string1_X[i];
  43.         Y_Vector2 = string1_Y[i + 1] - string1_Y[i];
  44.         Magnitude2 = sqrt((X_Vector2*X_Vector2) +  (Y_Vector2*Y_Vector2));
  45.         Extension2 = Magnitude2 - longueur_normale;
  46.  cout << "Magnitude 2 :" << Magnitude2 << endl;
  47.  cout << "Extension 2 :" << Extension2 << endl;
  48.         xv = (X_Vector1 / Magnitude1 * Extension1) + (X_Vector2 / Magnitude2 * Extension2);
  49.         yv = (Y_Vector1 / Magnitude1 * Extension1) + (Y_Vector2 / Magnitude2 * Extension2) + Gravity;
  50.         string2_X[i] = string1_X[i] + (xv * .01);
  51.         string2_Y[i] = string1_Y[i] + (yv * .01);
  52.   //Ici on peut changer la valeur .01 pour modifier le comportement de la chaine.
  53.   //cout << string2_X[i] << string2_Y[i] << endl;
  54.  }
  55. j++;
  56. for (i=0; i<32; i++)
  57.  {
  58.  string1_X[i]=string2_X[i];
  59.  string1_Y[i]=string2_Y[i];
  60.  }
  61. }
  62. return 0;
  63. }


 
 
évidement ça ne marche pas du premier coup. d'ailleurs on le voit bien dès la deuxième boucle for :

Code :
  1. for (i=0; i<32; i++)

,  
il va y avoir un problème avec :

Code :
  1. X_Vector1 = string1_X[i- 1] - string1_X[i];


puisque string1_X[-1] n'est pas défini.
 
Pourtant dans son algo, c'est bien ce qu'il à écrit, donc je ne comprends pas trop, si quelqu'un peut m'aider ?
 
Merci
 

Reply

Marsh Posté le 22-03-2007 à 13:05:30    

Code :
  1. #include <iostream>
  2. #include <math.h>
  3. using namespace std;
  4. class point{
  5. public:
  6. double x,y;
  7. point(){
  8.  x=0;
  9.  y=0;
  10. }
  11. };
  12. class vector{
  13. public:
  14. double x,y;
  15. vector(){
  16.  x=0;
  17.  y=0;
  18. }
  19. vector(double px,double py){
  20.  x=px;
  21.  y=py;
  22. }
  23. vector( point *p1, point *p2){
  24.  x=p1->x-p2->x;
  25.  y=p1->y-p2->y;
  26. }
  27. double getMagnitude(){
  28.  return sqrt((x*x)+(y*y));
  29. }
  30. };
  31. point stringc[32];
  32. void init(){
  33.     int i;
  34.     for (i=0; i<32; i++)
  35. {
  36.         stringc[i].x=0;
  37.         stringc[i].y=i;
  38. }
  39. }
  40. void calc(){
  41.     int i;
  42. point stringtmp[32];
  43. point *pcurr,*pnext,*pprev;
  44.     vector *vec;
  45.     double Magnitude,Extension;
  46.     const double normal_length = 1;
  47.     const double gravity=0;
  48. for (i=0; i<32; i++)
  49. {
  50.  vector vforce;
  51.  pnext=pprev=NULL;
  52.  pcurr=&stringc[i];
  53.  if(i>0)    pprev=&stringc[i-1];
  54.  if(i<31)   pnext=&stringc[i+1];
  55.  if(pprev){
  56.   vec = new vector(pprev,pcurr);
  57.   Magnitude = vec->getMagnitude();
  58.   Extension = Magnitude - normal_length;
  59.   cout << "Magnitude 1 :" << Magnitude << endl;
  60.   cout << "Extension 1 :" << Extension << endl;
  61.   vforce.x+= (vec->x / Magnitude * Extension);
  62.   vforce.y+= (vec->y / Magnitude * Extension);
  63.   delete vec;
  64.  }
  65.  if(pnext){
  66.   vec = new vector(pnext,pcurr);
  67.   Magnitude = vec->getMagnitude();
  68.   Extension = Magnitude - normal_length;
  69.   cout << "Magnitude 2 :" << Magnitude << endl;
  70.   cout << "Extension 2 :" << Extension << endl;
  71.   vforce.x+= (vec->x / Magnitude * Extension);
  72.   vforce.y+= (vec->y / Magnitude * Extension);
  73.   delete vec;
  74.  }
  75.  //apply forces    
  76.  vforce.y+=gravity;
  77.  stringtmp[i].x = stringc[i].x + (vforce.x * .01);
  78.  stringtmp[i].y = stringc[i].y + (vforce.y * .01);
  79.  //Ici on peut changer la valeur .01 pour modifier le comportement de la chaine.
  80.  //cout << string2_X[i] << string2_Y[i] << endl;
  81. }
  82. for (i=0; i<32; i++)
  83. {
  84.  stringc[i].x=stringtmp[i].x; //surdefinir loperateur =
  85.  stringc[i].y=stringtmp[i].y;
  86. }
  87. }
  88. int main()
  89. {
  90. int i;
  91. init();
  92.     for(i=0;i<3;i++)
  93. {
  94.         cout << "Boucle no " << i << ":" << endl;   
  95.  calc();
  96. }
  97.     return 0;
  98. }


Message édité par red faction le 22-03-2007 à 13:08:25
Reply

Sujets relatifs:

Leave a Replay

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