Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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
glTranslatef(0.0,0.0,0.0);
glBegin(GL_TRIANGLES);
glVertex3f(-5.0,10.0,0.0);
glVertex3f(0.0,10.0,0.0);
glVertex3f(5.0,10.0,0.0);
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
glTranslatef(0.0,5.0,0.0);
glBegin(GL_TRIANGLES);
glVertex3f(-5.0,5.0,0.0);
glVertex3f(0.0,-5.0,0.0);
glVertex3f(5.0,-5.0,0.0);
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
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.
printf("angolo a1=%f\n",a1); //stampo i valori per controllo
printf("angolo a2=%f\n",a2);
printf("angolo a3=%f\n",a3);
printf("angolo a4=%f\n",a4);
printf("valore px1=%f\n",px1);
printf("valore py1=%f\n",py1);
}
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
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
glTranslatef(0.0, 0.0, 0.0);
glRotatef(jk, 1.0, 0.0, 0.0);
linka();
glTranslatef(0.0, 0.0, 3.0); // linka è lungo 3.0
glRotatef(kj, 1.0, 0.0, 0.0);
linkb();
Ultima modifica effettuata da gfx il 02/12/2012 alle 22:12