簡體   English   中英

需要幫助在OpenGL中移動相機

[英]need help moving a camera in 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調用放在投影矩陣中時,它才會改變,而我一直被告知這是一個糟糕的主意。

設置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調用,也可以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);

感謝@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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM