Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C] opengl pushmatrix popmatrix
Forum - C/C++ - [C] opengl pushmatrix popmatrix - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 14:51
Mercoledì, 24/10/2012
il centro di un modello 3d non e' il baricentro, ma il punto in cui tu trasli l'oggetto per iniziare a renderizzare i vertici:

esempio

Codice sorgente - presumibilmente Plain Text

  1. glTranslatef(0.0,0.0,0.0);
  2.   glBegin(GL_TRIANGLES);
  3.       glVertex3f(-5.0,10.0,0.0);
  4.       glVertex3f(0.0,10.0,0.0);
  5.       glVertex3f(5.0,10.0,0.0);
  6.   glEnd();



Il "centro" dell'oggetto e' il punto che tu hai passato  a glTranslatef (quindi in questo caso un punto P(0.0,0.0,0.0) ) ..centro l'ho messo tra virgolette perche' non so quanto sia propria questa definizione, e' piu' giusto chiamarlo origine.

Se tu ora fai ruotare questo triangolo, il triangolo ruota attorno all'origine, cioe' P(0,0,0);

se il codice fosse stato cosi' :

Codice sorgente - presumibilmente Plain Text

  1. glTranslatef(0.0,5.0,0.0);
  2.   glBegin(GL_TRIANGLES);
  3.       glVertex3f(-5.0,5.0,0.0);
  4.       glVertex3f(0.0,-5.0,0.0);
  5.       glVertex3f(5.0,-5.0,0.0);
  6.   glEnd();



l'origine era il punto P(0.0,5.0,0.0), e applicando una rotazione, i vertici del triangolo ruotavano attorno a quel punto (in questo caso il triangolo ruotava su se stesso).

Percio' se io ho un braccio meccanico, potrebbe essermi utile che l'origine della parte inferiore coincida con il joint con la parte superiore, cosi' il braccio ruotera' attorno a quel punto :k:

PM Quote
Avatar
gfx (Normal User)
Newbie


Messaggi: 7
Iscritto: 14/10/2012

Segnala al moderatore
Postato alle 19:45
Giovedì, 08/11/2012
Codice sorgente - presumibilmente Plain Text

  1. glPushMatrix();
  2.         glTranslatef(0.0, 1.0, 0.0);
  3.         glRotatef(jk, 1.0, 0.0, 0.0);
  4.         linka();
  5.     glPushMatrix();
  6.         glTranslatef(0.0, 0.0, 3.0);    // linka è lungo 3.0
  7.         glRotatef(kj, 1.0, 0.0, 0.0);
  8.         linkb();
  9.     glPopMatrix();
  10.   glPopMatrix();
  11.   glPopMatrix();



questo in effetti funziona alla grande ...... purtroppo nella funzione di cinematica inversa avevo commesso un errore sulle dimensioni di un link. Era rimasto un vecchio valore inserito su una delle funzioni. Inutile dire che sballava tutto.

Codice sorgente - presumibilmente C/C++

  1. void ik3(float px1, float py1)
  2.  
  3. {
  4.    //calcolo ik per asse rosso
  5.  
  6.         float a1, a2, a3, a4, jj, jjj1, jjj, grd, jjx, jjy, kkx, kky;
  7.  
  8.         printf("px=%f\n",px1);
  9.         printf("py=%f\n",py1);
  10.        
  11.        
  12. jj =  (px1*px1 - py1*py1 - 9.0f - 25.0f)/(2*9.0f*25.0f);
  13.  
  14. jjj1 = 1 - jj*jj;
  15.  
  16. jjj = sqrt(jjj1);
  17.  
  18. a2 = atan2 (jjj, jj);
  19.  
  20. a1 = atan2(py1,px1) - atan2(5*jjj, 3+5*jj);
  21.  
  22.  
  23. grd = 180.0f/3.14592653589793f;
  24.  
  25.         a3 = a1 * grd;
  26.  
  27.         a4 = a2 * grd;
  28.  
  29.         jk = (a3);
  30.         kj = (a4);
  31.  
  32.  
  33.         printf("angolo a1=%f\n",a1);   //stampo i valori per controllo
  34.         printf("angolo a2=%f\n",a2);
  35.         printf("angolo a3=%f\n",a3);
  36.         printf("angolo a4=%f\n",a4);
  37.         printf("valore px1=%f\n",px1);
  38.         printf("valore py1=%f\n",py1);
  39.  
  40.  
  41. }



questa è la mia funzione ik ...... come detto funziona ...... uso px1 e py1 (ad ogni pressione di un tasto tastiera associato si incrementa o decrementa il valore di px1 o py1 di 0,1 )  per spostare un punto e in teoria dovrei ottenere che l'end effector mi segue il punto, almeno entro il raggio d'azione del braccio. Succede invece che se muovo solo px1 o solo py1 tutto l'end effector si muove in linea retta, ma più "lentamente" del punto, se muovo prima uno e dopo l'altro, quindi in teoria un movimento a zigzag dell'end effector    ...... invece ottengo un movimento di rotazione ..... come se muovessi il punto secondo una traiettoria curva.

cosa potrebbe essere nehai idea?

Ultima modifica effettuata da gfx il 10/11/2012 alle 9:09
PM Quote
Avatar
gfx (Normal User)
Newbie


Messaggi: 7
Iscritto: 14/10/2012

Segnala al moderatore
Postato alle 22:07
Domenica, 02/12/2012
incredibile!!!!

il codice di cui sopra funziona uguale anche senza i pop e push .... evidentemente non funzionavano a dovere oppure non ho capito la teoria .... questo codice mi dà gli stessi risultati del precedente.

Codice sorgente - presumibilmente Plain Text

  1. glTranslatef(0.0, 0.0, 0.0);
  2.         glRotatef(jk, 1.0, 0.0, 0.0);
  3.         linka();
  4.         glTranslatef(0.0, 0.0, 3.0);    // linka è lungo 3.0
  5.         glRotatef(kj, 1.0, 0.0, 0.0);
  6.         linkb();



Ultima modifica effettuata da gfx il 02/12/2012 alle 22:12
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo