C++ 需要在OpenGL中移动相机的帮助吗

C++ 需要在OpenGL中移动相机的帮助吗,c++,opengl,matrix,camera,C++,Opengl,Matrix,Camera,我正在做一个简单的OpenGL项目。 我想让一个简单的相机在透视模式下移动 我一直在读关于投影矩阵、gluLookAt和模型视图矩阵的书。我一直在读,我应该做的就是在投影矩阵中调用透视图,然后在模型视图矩阵中调用所有变换和相机移动 #include "GLheaders.h" void drawWorldAxis() { glLoadIdentity(); glBegin(GL_LINES); glNormal3f(0, 0, 1); glColor3ub(25

我正在做一个简单的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;
}
#包括“GLheaders.h”
void drawWorldAxis(){
glLoadIdentity();
glBegin(GL_行);
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,0255);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
格伦德();
}
无效键盘(无符号字符键,整数x,整数y){
再发现();
}
静态浮眼[3]={.5,5,5};
#包括
无效显示(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
gluPerspective(55.0,1,1,10000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
drawWorldAxis();
printf(“眼睛在\n”,眼睛[0],眼睛[1],眼睛[2]);
fflush(stdout);
gluLookAt(眼睛[0],眼睛[1],眼睛[2],0,0,0,0,1,0);
眼睛[0]+=0.1;
眼睛[1]+=.1;
glFlush();
glutSwapBuffers();
}
空洞重塑(整数w,整数h){
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
(55.0,1,-1,10000);
glMatrixMode(GLU模型视图);
再发现();
}
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度);
glutInitWindowSize(400400);
测试窗口(“微小测试”);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
键盘Func(键盘);
glEnable(GL_正常化);
glEnable(GLU深度试验);
glutMainLoop();
返回退出成功;
}
我希望这段代码显示代表世界坐标系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);

感谢@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;
}
#包括“GLheaders.h”
void drawWorldAxis(){
glBegin(GL_行);
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,0255);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
格伦德();
}
无效键盘(无符号字符键,整数x,整数y){
再发现();
}
静态浮眼[3]={-.1,-.1,1};
#包括
无效显示(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
gluPerspective(55.0,1,1,10000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
printf(“眼睛在\n”,眼睛[0],眼睛[1],眼睛[2]);
fflush(stdout);
gluLookAt(眼睛[0],眼睛[1],眼睛[2],0,0,0,0,1,0);
drawWorldAxis();
眼睛[0]+=0.1;
眼睛[1]+=.1;
glFlush();
glutSwapBuffers();
}
空洞重塑(整数w,整数h){
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
(55.0,1,-1,10000);
glMatrixMode(GLU模型视图);
再发现();
}
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度);
glutInitWindowSize(400400);
测试窗口(“微小测试”);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
键盘Func(键盘);
glEnable(GL_正常化);
glEnable(GLU深度试验);
glutMainLoop();
返回退出成功;
}

谢谢!这会引导我去我需要去的地方!loadIdentity也在创建它,因此我没有看到worldaxis,因为lookAt也没有应用于它。清除loadIdentity并重新排序似乎可以解决它!
#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;
}