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

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
gfx (Normal User)
Newbie


Messaggi: 7
Iscritto: 14/10/2012

Segnala al moderatore
Postato alle 18:13
Domenica, 14/10/2012
[color=#0000BF]salve a tutti  ..... sono bloccato e chiedo aiuto,

stò usando opengl con C per implementare il movimento di 2 bracci .... ilcalcolo dei loro posizionameti nello spazio è più che corretto (verificato con il cad per decine di punti) .... ma non riesco a visualizzare correttamente i loro spostamenti nello spazio visivo della mia finestra opengl.

più precisamente, ho questi due link  e due joint di cui calcolo gli angoli a partire da una posizione x1,y1 del loro end-effector, i due link sono disegnati con glucilinder .... e li visualizzo correttamente a video .... il problema è che :
Codice sorgente - presumibilmente Plain Text

  1. glTranslatef(0.0, 1.0, 0.0);
  2.     glRotatef(jk, 1.0, 0.0, 0.0);
  3.     linka();
  4.  
  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();



facendoli ruotare in questo modo (i due link sono appunto linka e linkb),  ottengo degli spostamenti incoerenti dell'end effector. Preciso che il target x1,y1 lo inserisco usando 4 tast tastiera (+/- x e y) e precisamente ad uno spostamento del targhet su x1 non corrisponde una traiettoria lineare dell'end effector che invece ruota in modo che a me sembre il risultato di altre rotazioni sommate alle mie ..... ma non sò dove se le vada a prendere .... ho eseguito il printf dei valori a video .... i valori sono corretti .... ma la visualizzazione errata  :noway:

Questo codice è all'interno della mia funzione display che  fà ruotare i riferimenti cartesiani attorno agli assi x,y,z. Ho provato a togliere la rotazione degli assi x,y,z .... ma il risultato non cambia..... sbaglio ad usare popmatrix-pushmatrix per questo compito? .... dovreicostruire delle matrici di rotazione senza usare la matrice opengl?? :noway::noway: [/color]

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 0:16
Lunedì, 15/10/2012
Non si capisce bene la domanda... se qualcosa non viene visualizzato nel posto giusto, solitamente e' per l'ordine in cui hai fatto le chiamate a glTranslatef e glRotatef... l'ordine e' importante (una discussione interessante la trovi qui: http://nicksnettravels.builttoroam.com/post/2010/03/08/Ope ... )

Prova ad invertire:

Codice sorgente - presumibilmente Plain Text

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



Oltre a questo, non si riesce a capire perche' chiami glPopMatrix due volte...


Il mio blog: https://piero.dev
PM Quote
Avatar
gfx (Normal User)
Newbie


Messaggi: 7
Iscritto: 14/10/2012

Segnala al moderatore
Postato alle 17:40
Lunedì, 15/10/2012
Grazie mille della risposta


popmatrix 2 volte è un errore ..... invertendo cambia .... ma non risolve.

linka e linkb sono due cilindri disegnati con glucilinder .... rappresentano un primordiale robot con due bracci .... jk e kj sono calcolati correttamente da una funzione di cinematica inversa ..... con 4 tasti tastiera sposto le coordinate y-z del punto targhet e la funzione di cinematica inversa mi restituisce i due angoli jk e kj con i quali dovrei fare ruotare i due link ..... il risultato su display opengl è incoerente mentre in realtà gli angoli sarebbero corretti (provati empiricamente al cad)..... per capirci ... se sposto z e tengo immutato y dovrei otetnere un movimento lungo una perpendicolare a y del punto finale di linkb ..... mentre invece ottengo una rotazione:om::om:

che fare? è corretto usare popmatrx e pushmatrix per queste operazioni?

PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 7:44
Martedì, 16/10/2012
uhm non so se ho capito bene il problema ma dal codice l'unica cosa che posso dedurre e' che linkb viene affetto dalle trasformazioni di linka.
inserisci glPushMatrix() prima delle trasformazioni di linka e glPopMatrix() dopo. la stessa cosa per linkb.. il codice dovrebbe quindi venire cosi

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. glPopMatrix();
  6.  
  7. glPushMatrix();
  8.     glTranslatef(0.0, 0.0, 3.0);    // linka è lungo 3.0
  9.     glRotatef(kj, 1.0, 0.0, 0.0);
  10.     linkb();
  11. glPopMatrix();



funziona? :k:

ps: suppongo che dentro alle funzioni linka e linkb non ci siano altre chiamate a glRotatef o glTranslatef, inoltre con questo codice i bracci ruotano sollo sull'asse x, e' quello che vuoi? ;)

pps: spiegato in termini empirici le chiamate push/pop matrix servono per "isolare" la matrice corrente cosicchè i modelli renderizzati dopo non vengano affetti da quelle trasformazioni.il fatto che sia giusto dipende da cosa devi fare: se hai due modelli di macchine da corsa che si muovono allora devono essere indipendenti una dall'altra, mentre se crei una camera che ti permette di muoverti nello spazio 3d allora tutti i modelli devono essere affetti da queste trasformazioni

ppps: linka e linkb sono due bracci separati? oppure sono le due parti dello stesso braccio? (quindi con un joint in mezzo?) :k:

Ultima modifica effettuata da carlduke il 16/10/2012 alle 7:58
PM Quote
Avatar
gfx (Normal User)
Newbie


Messaggi: 7
Iscritto: 14/10/2012

Segnala al moderatore
Postato alle 8:17
Martedì, 16/10/2012
no linka e linkb hanno un joint in mezzo .... non sono separati e quello che hai dedotto in proposito è corretto. Corretto èche vorrei solo rotazioni su asse x. Il tuo codice rende i link indipendenti .... risultato che non voglio ottenere.  Quindi invece dovrei includere linka e linkb nello stesso pop e push ..... corretto?

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.     glTranslatef(0.0, 0.0, 3.0);
  6.     glRotatef(kj, 1.0, 0.0, 0.0);
  7.     linkb();
  8.     glPopMatrix();



questo codice dovrebbe funzionare che dici ...... a me però rende solo dei movimenti non coerenti, anche se dal punto di vista estetico è quello che vorrei.

in particolare: spostando il punto targhet su un asse, l'estremità di linkb dovrebbe compiere un movimento rettilineo, almeno per un breve tratto (all'interno dell'area di lavoro dei link), cosa che non riesco a visualizzare. Vedo solo movimenti curvilinei. Perchè?? ..... trasformo ogni nuova coordinata del targhet nei rispettivi angoli jk ekj .... ad uno spostamento di 0,1 su un singolo asse dovrei vedere corrispossto un movimento di 0,1 del puntofinale del linkb su un solo asse ..... mentre vedo spostamenti di 0,2 o 0,5 circa .... insomma non corrispondenti ..... eppure al cad tutto risulta corretto.

cosa posso avere sbagliato?

Ultima modifica effettuata da gfx il 16/10/2012 alle 8:28
PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 14:14
Martedì, 16/10/2012
prova cosi' :

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. glPopMatrix();
  6.  
  7. glPushMatrix();
  8.     glRotatef(jk, 1.0, 0.0, 0.0); //angolo di linka
  9.     glTranslatef(0.0, 1.0, 3.0);    // linka è lungo 3.0
  10.     glRotatef(kj, 1.0, 0.0, 0.0);
  11.     linkb();
  12. glPopMatrix();



non so se funziona, dato che non riesco a capire pienamente qual è il problema ;)

forse quando ruoti la prima parte del braccio, la seconda non sta attaccata correttamente?

Ultima modifica effettuata da carlduke il 16/10/2012 alle 14:15
PM Quote
Avatar
gfx (Normal User)
Newbie


Messaggi: 7
Iscritto: 14/10/2012

Segnala al moderatore
Postato alle 19:46
Martedì, 16/10/2012
si con questo codice .....
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.     glPopMatrix();
  6.      
  7.     glPushMatrix();
  8.         glRotatef(jk, 1.0, 0.0, 0.0); //angolo di linka
  9.         glTranslatef(0.0, 1.0, 3.0);    // linka è lungo 3.0
  10.         glRotatef(kj, 1.0, 0.0, 0.0);
  11.         linkb();
  12.     glPopMatrix();



le due parti  non stanno ataccate..... in questo modo invece sì:

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.         glTranslatef(0.0, 0.0, 3.0);    // linka è lungo 3.0
  6.         glRotatef(jk, 1.0, 0.0, 0.0); //angolo di linka
  7.         glRotatef(kj, 1.0, 0.0, 0.0);
  8.         linkb();
  9.     glPopMatrix();



ma ancora non ci siamo ..... i movimenti non sono lineari ..... ripeto, con tasti tastiera sposto un punto in y,z ..... il vertice del linkb dovrebbe seguire il punto ..... invece quando mi sposto lungo un solo asse ,per es. z, ottengo una rotazione dei link tale che fà disegnare un arco al vertice del linkb, quando invece dovrebbe seguiore il punto su una retta!!!!! .... ma i calcoli sono corretti!!!! per quale morivo dovrei ottenere un arco quando invece dovrei ottenere una retta??

Grazie molte della pazienza.

PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 20:40
Domenica, 21/10/2012
allora, un po' di tempo fa mi ero dedicato a un progetto del genere, cioe' avevo un robot formato da varie parti che renderizzavo in 3d con opengl (l'obiettivo era quello di creare dei robot intelligenti tramite degli script in un linguaggio che avevo creato e semplicemente di farli combattere tra di loro :D (ot) ) comunque avevo avuto piu' o meno il tuo stesso problema, quando mi ruotava una parte del braccio si staccava l'altra, e questo e dovuto principalmente a due cose:

-  errori nel calcolare la posizione translata, partendo dagli angoli di rotazione della parte superiore del braccio,
    (in sostanza una rotazione di un punto nello spazio 3d)
- il centro della mesh.

il mio consiglio e' quello di ricontrollare tutti i calcoli, e poi tieni conto che il modello ruotera' attorno al suo centro.
Quando crei un modello in 3D per esempio con blender, c'è la possibilita' di impostare il suo centro. Ti faccio un esempio: se io creo un modello di porta e imposto il suo centro a meta' della sua larghezza, ruotandola sull'asse y, la porta ruotera attorno a se stessa (come quelle porte girevoli dei centri commerciali), se invece imposto il centro su un lato, la porta ruotera' come se avesse dei cardini, quindi come la porta di casa.

Per i modelli che disegni con glutSolid*() solitamente il centro e' nel centro fisico dell'oggetto, quindi questo potrebbe essere un problema ;) ma sono quasi sicuro che e' un errore di calcolo :k:

io risolverei in questo modo:

partendo dalla rotazione della parte superiore del braccio, vado a ruotare un punto (che in questo caso e' il mio joint) e successivamente in quella posizione (nel joint) vado a renderizzare la parte inferiore del braccio (con la sua rotazione indipendente dalla parte superiore)

PM Quote
Avatar
gfx (Normal User)
Newbie


Messaggi: 7
Iscritto: 14/10/2012

Segnala al moderatore
Postato alle 8:18
Mercoledì, 24/10/2012
quindi scrivendo la cosa in questo modo:


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();            //costituito da un glpoint a 0,0,3
  5.         glPopMatrix();
  6.          
  7.         glPushMatrix();
  8.             glRotatef(jk, 1.0, 0.0, 0.0); //angolo di linka
  9.             glTranslatef(0.0, 1.0, 3.0);    // linka è lungo 3.0
  10.             glRotatef(kj, 1.0, 0.0, 0.0);
  11.             linkb(); //costituito da un glpoint a 0,0,5
  12.         glPopMatrix();




dovrei togliermi di mezzo il problema della rotazione sul baricentro, visto che un punto è un punto. Non sapevo che i solidi ruotano attorno al loro baricentro ..... quindi se ho capito bene:

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();           //costituito da GLUCILINDER
  5.         glPopMatrix();



in questo caso la rotazione avviene lungo l'asse "Y" ma rispetto il baricentro del cilindro, quindi se il cilindro è praticamente senza spessore e lungo 3, con base in 0,1,0, è il punto 0,1,1.5 a ruotare attorno all'asse "Y" trascinandosi dietro il cilindro!!

1--E' corretto quello che ho capito?

Se così fosse tutto si spiega .....
2--immagino la stessa cosa non valga per le strutture/solidi "wired" .... ho capito bene? è vera questa mia supposizione? potrei allora sostituire i punti con dei parallelepipedi "wired" ottenendo lo stesso risultato ed evitando l'inconveniente del "solido".

Grazie ancora .....

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo