PDA

View Full Version : [C OpenGl] Problema con posizionamento del punto di vista


-NaNo-
20-04-2012, 18:00
Innanzitutto buongiorno, sono un nuovo utente, appena registratomi su questo meraviglioso forum.

Ora veniamo al problema in oggetto al topic:
Sto facendo un progetto di OpenGl, in linguaggio C, brevemente il progetto chiede di ricevere in input una mappa (immagine in formato .tga), dove a pixel colorati corrispondono vari elementi (semafori, lampioni, palazzi).
Il programma genera quindi una mappa tridimensionale, navigabile con tastiera e mouse.

Fino a qui tutto ok, la mappa viene creata correttamente e riesco a muovermi dentro ad essa senza problemi.
Il mio problema però è che la telecamera non è dove voglio che sia all'inizio della navigazione.
In dettaglio, sulla mappa è presente un pixel verde, che identifica l posizione di partenza, in cui posizionare la telecamera ad inizio esecuzione. Sulla mappa 3d disegno senza problemi il pixel nella posizione corretta, ma ho un problema nel posizionarci sopra la mia telecamera. In pratica, se uso gli stessi valori di x e z che ho usato per posizionare il pixel in una glTranslate, la telecamera viene messa molto distante dalla mappa. Sembra quasi che le coordinate che uso per creare/disegnare la mappa non siano le stesse che uso per spostarmi...
Questo è il codice che uso per posizionare la mia telecamera:

for(long i=0; i!=n_pixel*3; i+=3) {
rosso=*(puntatore+i);
verde=*(puntatore+i+1);
blu=*(puntatore+i+2);
if((rosso==0)&&(verde==255)&&(blu==0)){ //Se leggo un pixel verde imposto la telecamera
xpos=(float)righe;
zpos=(float)colonne;
}
colonne++;
if(colonne==base){
colonne=0;
righe++;
}
}
...


...
glTranslated(-xpos, 0,-zpos);
...



Il pezzo di codice che mi disegna il pixel verde è:

for(long i=0; i!=n_pixel*3; i+=3) {

rosso=*(puntatore+i);
verde=*(puntatore+i+1);
blu=*(puntatore+i+2);

if((rosso==0)&&(verde==255)&&(blu==0)) { //Se leggo un pixel verde imposto la telecamera
glColor3f(0,1,0);
glBegin(GL_POLYGON);
glVertex3f (righe-0.5, 0, colonne-0.5);
glVertex3f (righe+0.5, 0, colonne-0.5);
glVertex3f (righe+0.5, 0, colonne+0.5);
glVertex3f (righe-0.5, 0, colonne+0.5);
glEnd();
glColor3f(1,1,1);
}
colonne++;
if(colonne==base){
colonne=0;
righe++;
}
}


La funzione glTranslate che uso per impostare la posizione è la stessa che uso per gestire il movimento della camera con la tastiera.

Qualcuno mi può spiegare quale sia il mio problema?

Grazie in anticipo a tutti!

yorkeiser
23-04-2012, 14:41
Bisognerebbe vedere di più per capire, comunque: provato a posizionare il viewPoint con la funzione gluLookAt()?

gluLookAt(OsservatoreX, OsservatoreY, OsservatoreZ, PuntoOsservatoX, ,PuntoOsservatoY, PuntoOsservatoZ, NormaleX,NormaleY,NormaleZ).

Ad esempio, se l'osservatore sta in [xpos,ypos,zpos], osserva l'origine degli assi [0.0,0.0,0.0] e il piano su cui giace è orizzontale (quindi normale diretta verso l'alto, [0.0,1.0,0.0]), potresti usare:

gluLookAt(xpos,ypos,zpos,0.0,0.0,0.0,0.0,1.0,0.0);

-NaNo-
26-04-2012, 14:37
Usando la gluLookAt la metterei al posto della translate, quindi andrebbe a darmi problemi al sistema di spostamento della telecamera... Ho provato a fare in modo che la gluLookAt venga eseguita solo una volta, nel momento in cui viene letta la mappa la prima volta, usando una variabile booleana ed un if, ma non sembra funzionare.

Sinceramente non riesco a capire quale sia il problema, sembra un problema di proporzioni degli indici, nel primo for li vede con una certa "scala" e nel secondo con un'altra...

-NaNo-
18-05-2012, 14:17
Non avendo ancora risolto uppo il thread...
Ho provato ogni soluzione che mi è venuta in mente, ma ancora non sono riuscito a risolvere... Se volete il codice completo mandatemi un pm che ve lo mando...

Z80Fan
20-05-2012, 19:09
Sei sicuro che prima del glTranslate il sistema di coordinate non sia già stato spostato da qualche codice precedente?

Prova a mettere un glLoadIdentity() subito prima del glTranslate.

-NaNo-
21-05-2012, 14:00
Il sistema di coordinate è a posto, anche perchè la LoadIdentity la faccio già subito prima...

Z80Fan
21-05-2012, 19:14
Ho notato solo ora: perchè neghi "righe" e "colonne" prima di assegnarle a xpos e zpos?

xpos=(float)-righe;
zpos=(float)-colonne;

Se è perchè devi traslare la visuale nel senso opposto, allora non devi negare (ovvero, ri-negare) le variabili nella glTranslate.

Magari può essere questo?

-NaNo-
25-05-2012, 15:22
:/ Piccolo errore che poi ho corretto nella versione successiva, qui mi sono dimenticato di metterlo a posto... Non è nemmeno quello, sono rimaste negate 2 volte perchè nei vari tentativi per trovare una soluzione avevo provato a negarle 2 volte...

Z80Fan
25-05-2012, 18:24
Allora non so proprio quale sia il problema. :/

Il codice postato sembra totalmente corretto, il problema dev'essere da qualche altra parte...