2015-11-01 33 views
0

我正在開發一個簡單的OpenGL項目。 我想要一個簡單的相機在透視模式下移動。需要幫助在OpenGL中移動攝像頭

我不斷閱讀投影矩陣,gluLookAt和模型視圖矩陣。我一直在閱讀,我應該做的就是我的觀點調用投影矩陣,然後調用模型視圖矩陣中的所有轉換和相機移動。

#include "GLheaders.h" 

void drawWorldAxis() { 
    glLoadIdentity(); 
    glBegin(GL_LINES); 
    glNormal3f(0, 0, 1); 
    glColor3ub(255, 0, 0); 
    glVertex3f(0,0,0); 
    glVertex3f(1,0,0); 
    glColor3ub(0, 255, 0); 
    glVertex3f(0,0,0); 
    glVertex3f(0,1,0); 
    glColor3ub(0, 0, 255); 
    glVertex3f(0,0,0); 
    glVertex3f(0,0,1); 
    glEnd(); 
} 

void keyboard(unsigned char key, int x, int y) { 
    glutPostRedisplay(); 
} 

static float eye[3] = {.5, .5, .5}; 
#include <stdio.h> 
void display() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(55.0, 1, .1, 10000); 



    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    drawWorldAxis(); 
    printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]); 
    fflush(stdout); 
    gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0); 

    eye[0] += .1; 
    eye[1] += .1; 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) { 
    glViewport(0,0,w,h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(55.0, 1, -1, 10000); 
    glMatrixMode(GL_MODELVIEW); 
    glutPostRedisplay(); 

} 

int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH); 
    glutInitWindowSize(400,400); 
    glutCreateWindow("Tiny Test"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutKeyboardFunc(keyboard); 

    glEnable(GL_NORMALIZE); 
    glEnable(GL_DEPTH_TEST); 

    glutMainLoop(); 

    return EXIT_SUCCESS; 
} 

我期待這個代碼,以顯示三行代表世界座標系中的X,Y軸和Z軸,並且鍵被按下相機應該移動,並開始尋找原點/從多個座標軸系和更激烈的角度。

這裏怎麼回事?我一直在將我的頭撞到牆上,試圖找出爲什麼沒有任何動作。它只會改變,如果我把gluLookAt調用投影矩陣,我不斷告訴是一個可怕的想法。

回答

2

座標十字架畫在之前你設置lookAt矩陣,因此矩陣沒有效果。

你必須改變的順序,使得繪製時所述基質已經存在:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0); 
drawWorldAxis(); 
printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]); 
fflush(stdout); 

然後有一個第二個問題:您正在復位在drawWorldAxis第一行中的模型矩陣。在這裏,你可以刪除的glLoadIdentity來電或以前的矩陣首先推到堆棧:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0); 

glPushMatrix();  

drawWorldAxis(); 

glPopMatrix(); 

printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]); 
fflush(stdout); 
+0

謝謝!這導致我需要去的地方! loadIdentity也是爲了讓我沒有看到worldaxis,因爲lookAt沒有被應用到它。清理loadIdentity,重新排序的東西似乎解決了它! –

0

感謝@BDL幫助解決這個問題!這是我想要的正確代碼

#include "GLheaders.h" 

void drawWorldAxis() { 
    glBegin(GL_LINES); 
    glNormal3f(0, 0, 1); 
    glColor3ub(255, 0, 0); 
    glVertex3f(0,0,0); 
    glVertex3f(1,0,0); 
    glColor3ub(0, 255, 0); 
    glVertex3f(0,0,0); 
    glVertex3f(0,1,0); 
    glColor3ub(0, 0, 255); 
    glVertex3f(0,0,0); 
    glVertex3f(0,0,1); 
    glEnd(); 
} 

void keyboard(unsigned char key, int x, int y) { 
    glutPostRedisplay(); 
} 

static float eye[3] = {-.1, -.1, 1}; 
#include <stdio.h> 
void display() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(55.0, 1, .1, 10000); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]); 
    fflush(stdout); 
    gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0); 
    drawWorldAxis(); 

    eye[0] += .1; 
    eye[1] += .1; 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) { 
    glViewport(0,0,w,h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(55.0, 1, -1, 10000); 
    glMatrixMode(GL_MODELVIEW); 
    glutPostRedisplay(); 

} 

int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH); 
    glutInitWindowSize(400,400); 
    glutCreateWindow("Tiny Test"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutKeyboardFunc(keyboard); 

    glEnable(GL_NORMALIZE); 
    glEnable(GL_DEPTH_TEST); 

    glutMainLoop(); 

    return EXIT_SUCCESS; 
}