2009-06-29 23 views
15

Sono un principiante nella programmazione OpenGL con C++ e non molto bravo in matematica. C'è un modo semplice per avere una proiezione isometrica?proiezione isometrica vera con opengl

Voglio dire the true isometric projection, non la proiezione ortogonale generale.

(proiezione isometrica avviene solo quando proiezioni di unità X, Y e Z sono vettori altrettanto lungo e angoli tra loro sono esattamente 120 gradi.)

frammenti di codice sono molto apprezzati ..

+0

duplicato http://www.allegro.cc/forums/thread/600737 – aib

risposta

26

Prova utilizzando gluLookAt

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

/* use this length so that camera is 1 unit away from origin */ 
double dist = sqrt(1/3.0); 

gluLookAt(dist, dist, dist, /* position of camera */ 
      0.0, 0.0, 0.0, /* where camera is pointing at */ 
      0.0, 1.0, 0.0); /* which direction is up */ 
glMatrixMode(GL_MODELVIEW); 

glBegin(GL_LINES); 

glColor3d(1.0, 0.0, 0.0); 
glVertex3d(0.0, 0.0, 0.0); 
glVertex3d(1.0, 0.0, 0.0); 

glColor3d(0.0, 1.0, 0.0); 
glVertex3d(0.0, 0.0, 0.0); 
glVertex3d(0.0, 1.0, 0.0); 

glColor3d(0.0, 0.0, 1.0); 
glVertex3d(0.0, 0.0, 0.0); 
glVertex3d(0.0, 0.0, 1.0); 

glEnd(); 

glFlush(); 

Risultati in

alt text

Possiamo trarre un cubo di verificare che le linee parallele sono infatti paralleli

glPushMatrix(); 
glTranslated(0.5, 0.5, 0.5); 
glColor3d(0.5, 0.5, 0.5); 
glutWireCube(1); 
glPopMatrix(); 

alt text

+0

Questo non si darà una proiezione isometrica, perché le linee parallele, dire lungo gli assi xey, non apparirà parallelo, quando in realtà dovrebbero. –

+0

guarda l'immagine sull'articolo di Wikipedia che è stato collegato anche nella domanda, questo sembra esattamente come quella proiezione. Qualsiasi linea parallela apparirà parallela perché questa è una proiezione ortogonale (http://en.wikipedia.org/wiki/Progettazione orografica). Gli assi xey non sono paralleli. – cobbal

+0

Non intendo dire che gli assi xey siano paralleli, ma che le linee parallele all'asse x debbano apparire parallele in una proiezione isometrica (e non credo che lo saranno nel tuo), e allo stesso modo nella direzione y. –

3

forse io non sono del tutto Grokking la matematica in modo corretto, ma non potevamo basta posizionare la fotocamera in quanto spiega in quel collegamento Wikipedia e usa una proiezione ortogonale standard?

Anche se non è lo stesso, lo stack di proiezione dipende interamente da voi.

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
// your isometric matrix here (see math on Wikipedia) 
glMatrixMode(GL_MODELVIEW); 
7

Una proiezione isometrica è solo una questione di utilizzare una proiezione ortografica con un angolo di rotazione specifico.

Dovresti essere in grado di scegliere uno degli 8 potenziali orientamenti, con una proiezione ortogonale, e ottenere una vista isometrica perfetta del modello. Segui semplicemente la matematica nel tuo articolo Wiki di riferimento per l'impostazione della matrice di visualizzazione e fai una proiezione ortogonale per la matrice di proiezione, e tutto è pronto.

0

Se non si desidera utilizzare GLU, ecco ossa nude utilizzando glOrtho

void gl_enter_2_5d_mode (void) 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 

    glLoadIdentity(); 

    double scale = 50; 
    glOrtho(-scale, 
      scale, 
      -scale * 0.7, 
      scale * 0.7, 
      -scale, 
      scale); 

    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 

    glLoadIdentity(); 

    glRotatef(35.264f, 1.0f, 0.0f, 0.0f); 
    glRotatef(-45.0f, 0.0f, 1.0f, 0.0f); 
} 

void gl_leave_2_5d_mode (void) 
{ 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 

    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
} 

then draw a cube in it 

void cube (double size) 
{ 
    glBegin(GL_QUADS); 

    glVertex3f(size,size,size); 
    glVertex3f(-size,size,size); 
    glVertex3f(-size,-size,size); 
    glVertex3f(size,-size,size); 

    glVertex3f(size,size,-size); 
    glVertex3f(-size,size,-size); 
    glVertex3f(-size,-size,-size); 
    glVertex3f(size,-size,-size); 

    glVertex3f(size,size,size); 
    glVertex3f(size,-size,size); 
    glVertex3f(size,-size,-size); 
    glVertex3f(size,size,-size); 

    glVertex3f(-size,size,size); 
    glVertex3f(-size,-size,size); 
    glVertex3f(-size,-size,-size); 
    glVertex3f(-size,size,-size); 

    glVertex3f(size,size,size); 
    glVertex3f(-size,size,size); 
    glVertex3f(-size,size,-size); 
    glVertex3f(size,size,-size); 

    glVertex3f(size,-size,size); 
    glVertex3f(-size,-size,size); 
    glVertex3f(-size,-size,-size); 
    glVertex3f(size,-size,-size); 

    glEnd(); 
} 

void test (void) 
{ 
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
    glBindTexture(GL_TEXTURE_2D, 0); 
    cube(1.0); 
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 
} 

e chiamare qualcosa di simile

gl_enter_2_5d_mode() 
test() 
gl_leave_2_5d_mode() 

dovrebbe volete passare tra 2D e 2.5D (così puoi disegnare la tua interfaccia utente) quindi ho funzioni simili per entrare e uscire dalla modalità 2d es

void gl_init_2d_mode (void) 
{ 
    /* 
    * Enable Texture Mapping 
    */ 
    glEnable(GL_TEXTURE_2D); 

    /* 
    * Enable alpha blending for sprites 
    */ 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    /* 
    * Setup our viewport 
    */ 
    glViewport(0, 0, game.video_pix_width, 
       game.video_pix_height); 

    /* 
    * Make sure we're changing the model view and not the projection 
    */ 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 

    /* 
    * Reset the view 
    */ 
    glLoadIdentity(); 

    gl_init_fbo(); 
} 

void gl_enter_2d_mode (void) 
{ 
    /* 
    * Change to the projection matrix and set our viewing volume. 
    */ 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 

    /* 
    * Reset the view 
    */ 
    glLoadIdentity(); 

    /* 
    * 2D projection 
    */ 
    glOrtho(0, 
      game.video_gl_width, game.video_gl_height, 
      0, -1200.0, 1200.0); 

    /* 
    * Make sure we're changing the model view and not the projection 
    */ 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 

    /* 
    * Reset the view 
    */ 
    glLoadIdentity(); 
}