|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 5
|
[C OpenGl] Problema con posizionamento del punto di vista
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: Codice:
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);
...
Codice:
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++;
}
}
Qualcuno mi può spiegare quale sia il mio problema? Grazie in anticipo a tutti!
__________________
Forever servant of my lord, by choice and not submission... Ultima modifica di -NaNo- : 25-05-2012 alle 15:23. Motivo: Corretta la doppia negazione. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
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);
__________________
Il sole è giallo |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 5
|
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...
__________________
Forever servant of my lord, by choice and not submission... |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 5
|
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...
__________________
Forever servant of my lord, by choice and not submission... |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
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. |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 5
|
Il sistema di coordinate è a posto, anche perchè la LoadIdentity la faccio già subito prima...
__________________
Forever servant of my lord, by choice and not submission... |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Ho notato solo ora: perchè neghi "righe" e "colonne" prima di assegnarle a xpos e zpos?
Codice:
xpos=(float)-righe; zpos=(float)-colonne; Magari può essere questo? |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 5
|
:/ 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...
__________________
Forever servant of my lord, by choice and not submission... |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Allora non so proprio quale sia il problema. :/
Il codice postato sembra totalmente corretto, il problema dev'essere da qualche altra parte... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:10.





















