2010-08-07 13 views
12

Sto provando a capire il sistema di coordinate OpenGL. Ovunque io veda è descritto come destrimano, ma non corrisponde alla mia esperienza. Ho provato a disegnare forme e oggetti tridimensionali e vedo che apparentemente punti z-axis "nello schermo" (mentre x punta a destra e y su - che è la descrizione del sistema di coordinate mancino). Cosa mi manca?Dove punti OpenGL z-axis?

edit: Per esempio:
http://img576.imageshack.us/img576/9234/triangles.jpg
Se + punti Z spettatore, perché triangolo verde, che coordinata z è più grande, è dietro uno rosso?

initializeGL:

qglClearColor(Qt::darkGray); 
glClearDepth(1.0); 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL);  
glEnable(GL_COLOR); 

resizeGL:

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, 50.0, -50.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

paintGL:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glRotatef (-30.0, 1.0, 0.0, 0.0); 
glRotatef (20.0, 0.0, 1.0, 0.0); 
glColor3f(1.0, 0.0, 0.0); 
glBegin(GL_LINES); 
glVertex3f(45.0, 0.0, 0.0); 
glVertex3f(-45.0, 0.0, 0.0); 
glVertex3f(0.0, 45.0, 0.0); 
glVertex3f(0.0, -45.0, 0.0); 
glVertex3f(0.0, 0.0, 45.0); 
glVertex3f(0.0, 0.0, -45.0); 
glEnd(); 
glBegin(GL_TRIANGLES); 
//Red triangle: 
glColor3f(1.0, 0.0, 0.0); 
glVertex3f(0.0, 0.0, 1.0); 
glVertex3f(0.0, 20.0, 1.0); 
glVertex3f(20.0, 0.0, 1.0); 
//Green triangle:  
glColor3f(0.0, 1.0, 0.0); 
glVertex3f(-15.0, 0.0, 20.0); 
glVertex3f(0.0, 25.0, 20.0); 
glVertex3f(15.0, 0.0, 20.0); 
glEnd(); 
+0

"Se il visualizzatore di punti + Z, perché il triangolo verde, che la coordinata z è più grande, è dietro quello rosso?" Hai ruotato l'intera scena due volte. Chiama glLoadIdentity per la matrice della vista del modello prima di rendere i triangoli, quindi confrontare i risultati. – SigTerm

risposta

5

ultimi 2 parametri glOrtho riferimento:

nearVal, Farväl
Specificare le distanze dal vicino e piani di profondità ritaglio più lontane. Questi valori sono negativi se l'aereo deve essere dietro al visualizzatore.

L'aereo di ritaglio più vicino è davanti allo spettatore e più lontano, dietro. Girerà l'asse Z.

+3

Questo è essenzialmente quello che ho detto 12 ore prima di questa risposta. – JustBoo

+0

Sì, l'asse z è stato effettivamente capovolto accidentalmente, ma poi ho avuto un problema con la localizzazione esatta della linea di codice responsabile per quello – majaen

8

Va bene, la cosa che spicca per me è la funzione glOrtho. I piani di ritaglio vicini e lontani sono distanti solo 100 unità. Sembra molto piccolo. Lo vuoi davvero in questo modo? È rappresentato dagli ultimi 2 parametri in quella funzione.

Anche i tuoi oggetti sono molto grandi in relazione a questo piccolo tronco. Gli oggetti potrebbero essere seduti direttamente davanti alla videocamera e impedirebbero la visualizzazione di altri oggetti.

Vorrei ingrandire tutti i parametri nella chiamata glOrtho. HTH


In un sistema destrorso (OpenGL) Z negativo (Z) deve puntare nella schermata. La Y positiva dovrebbe essere "in alto" e la X positiva dovrebbe essere a destra.

Questo sembra essere quello che hai descritto, e quello è un sistema di coordinate destrorso.

Forse questo può aiutare. http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf

+0

Per asse z "nello schermo" intendevo Z positivo (la coordinata Z del punto più grande è, più lontana è). Non uso glScale con valori negativi o qualcosa di simile, quindi è un po 'misterioso per me. – majaen

+0

@majaen: Forse si imposta la matrice modelview in modo diverso. Più grande è la z, gli oggetti più vicini sono per te. – SigTerm

+1

Sei sicuro che, da qualche parte nel codice, uno degli assi non viene "capovolto"? Ricordo (vagamente) una volta che ho capovolto alcuni assi e ho persino creato l'origine in alto a sinistra per ospitare un sistema in Windows. Sembra che qualcosa nel codice provochi stranezze. – JustBoo

1

Dipende come si disegna.

un'identità per modelview e una glu regolare per la proiezione si aspettano un sistema di coordinate di input destrorso (come menzionato da JustBoo, ​​-z è nello schermo).

se si carica un diverso insieme di matrici, tuttavia, nulla vi impedisce di lanciare una delle coordinate nella matrice, risultando in un sistema per mancini. (o non flip. gluPerspective/glFrustum effettivamente capovolge le coordinate z). Ci sono alcune cose pratiche da tenere a mente quando si fa questo, come l'ordine di abbattimento per l'abbattimento.

5

Cosa mi manca?

In (viewport di) sistema di mancini x punti destra, y punti in su, z punti forward (lontano dal visualizzatore).

In mano destra x punti destra, y punti in su, z punti indietro (verso lo spettatore).

Picture

immagine è presa dal wikipedia.

x è pollice, y è indice e z è il dito medio.

+0

grazie per il link, è molto più semplice da spiegare con questa immagine :) – Calvin1602