C 调用gluLookAt时OpenGL不显示任何内容

C 调用gluLookAt时OpenGL不显示任何内容,c,opengl,C,Opengl,我正在开发一个实践OpenGL程序。我基本上是想展示一个金字塔。我粘贴了到目前为止的代码。我遇到的问题是,当我打电话给GluLook时,我的屏幕变得完全黑了。这对我来说没有意义。我的金字塔有一个三角形,其尺寸限制在一个大小为(1,1,1)的盒子内,并且位于原点。因此,如果我把眼睛放在远处,如果(10,10,10),看(0,0,0),为什么我看不到金字塔。当我发表评论时,我能看得很清楚 #include <GL/glut.h> #include <stdlib.h> #in

我正在开发一个实践OpenGL程序。我基本上是想展示一个金字塔。我粘贴了到目前为止的代码。我遇到的问题是,当我打电话给GluLook时,我的屏幕变得完全黑了。这对我来说没有意义。我的金字塔有一个三角形,其尺寸限制在一个大小为(1,1,1)的盒子内,并且位于原点。因此,如果我把眼睛放在远处,如果(10,10,10),看(0,0,0),为什么我看不到金字塔。当我发表评论时,我能看得很清楚

#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>

struct
{
    GLuint trifan;
    GLuint tribase;
    GLuint colors;
} b;

void display();
void init_buffer();
void check_errors();
void reshape(int w, int h);
void keyboard(unsigned char k, int x, int y);

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(500, 500);
    glutCreateWindow("Pyramid");

    init_buffer();
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);

    glutMainLoop();
}

void init_buffer()
{
    glGenBuffers(1, &(b.trifan));
    glBindBuffer(GL_ARRAY_BUFFER, b.trifan);

    GLfloat trifan[6][3] =
    {
        {0.0, 1.0, 0.0},
        {1.0, 0.0, 1.0},
        {-1.0, 0.0, 1.0},
        {-1.0, 0.0, -1.0},
        {1.0, 0.0, -1.0},
        {1.0, 0.0, 1.0}
    };

    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, trifan, GL_STATIC_COPY);

    glGenBuffers(1, &b.colors);
    glBindBuffer(GL_ARRAY_BUFFER, b.colors);

    GLfloat colors[6][3] = 
    {
            {1.0, 0.0, 0.0},
            {1.0, 0.0, 0.0},
            {1.0, 0.0, 0.0},
            {1.0, 0.0, 1.0},
            {0.5, 0.0, 1.0},
            {1.0, 0.0, 0.5},
    };
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, colors, GL_STATIC_COPY);

    check_errors();
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, (float)w / (float)h, 1.0, 100.0);
}

float angle = 0.0;
float zoom = 1.0;
void keyboard(unsigned char k, int x, int y)
{
    if(k == 'x')
    {
        angle += 10;
    }
    else if(k == 'y')
    {
        angle -= 10;
    }
    else if(k == 'w')
    {
        zoom += 0.1;
    }
    else if(k == 's')
    {
        zoom -= 0.1;
    }

    glutPostRedisplay();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotated(angle, 1.0, 0.0, 0.0);
    gluLookAt(10.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    {
        glBindBuffer(GL_ARRAY_BUFFER, b.trifan);
        glVertexPointer(3, GL_FLOAT, 0, 0);

        glBindBuffer(GL_ARRAY_BUFFER, b.colors);
        glColorPointer(3, GL_FLOAT, 0, 0);

        glDrawArrays(GL_TRIANGLE_FAN, 0, 6);
    }
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    check_errors();
    glFlush();
}

void check_errors()
{
    GLint err = glGetError();
    if(err != GL_NO_ERROR)
    {
        fputs((char*)gluErrorString(err), stderr);
        exit(1);
    }
}
#包括
#包括
#包括
结构
{
GLuint-trifan;
胶合三基;
胶合色;
}b;
void display();
void init_buffer();
无效检查_错误();
空洞重塑(int w,int h);
无效键盘(无符号字符k、整数x、整数y);
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitWindowSize(500500);
窗口(“金字塔”);
初始化缓冲区();
glutDisplayFunc(显示器);
键盘Func(键盘);
glutMainLoop();
}
void init_buffer()
{
glGenBuffers(1,&(b.trifan));
glBindBuffer(GL_数组_BUFFER,b.trifan);
glfan[6][3]=
{
{0.0, 1.0, 0.0},
{1.0, 0.0, 1.0},
{-1.0, 0.0, 1.0},
{-1.0, 0.0, -1.0},
{1.0, 0.0, -1.0},
{1.0, 0.0, 1.0}
};
glBufferData(GL_数组_缓冲区,大小(GLfloat)*3*6,trifan,GL_静态_拷贝);
glGenBuffers(1和b.colors);
glBindBuffer(GL_数组_BUFFER,b.colors);
GLfloat颜色[6][3]=
{
{1.0, 0.0, 0.0},
{1.0, 0.0, 0.0},
{1.0, 0.0, 0.0},
{1.0, 0.0, 1.0},
{0.5, 0.0, 1.0},
{1.0, 0.0, 0.5},
};
glBufferData(GL_数组_缓冲区,大小(GLfloat)*3*6,颜色,GL_静态_拷贝);
检查_错误();
}
空洞重塑(整数w,整数h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
(60,(浮子)w/(浮子)h,1.0100.0);
}
浮动角度=0.0;
浮动缩放=1.0;
无效键盘(无符号字符k、整数x、整数y)
{
如果(k='x')
{
角度+=10;
}
如果(k='y')
{
角度-=10;
}
else如果(k='w')
{
缩放+=0.1;
}
else如果(k='s')
{
缩放-=0.1;
}
再发现();
}
无效显示()
{
glClear(GLU颜色缓冲位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gl旋转(角度,1.0,0.0,0.0);
gluLookAt(10.0,10.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
glEnableClientState(GL_颜色_阵列);
glEnableClientState(GL_顶点_数组);
{
glBindBuffer(GL_数组_BUFFER,b.trifan);
glvertexofinter(3,GL_FLOAT,0,0);
glBindBuffer(GL_数组_BUFFER,b.colors);
glColorPointer(3,GL_浮点,0,0);
gldrawArray(GL_三角形_扇,0,6);
}
glDisableClientState(GL_颜色_数组);
glDisableClientState(GL_顶点_数组);
检查_错误();
glFlush();
}
无效检查_错误()
{
GLint err=glGetError();
如果(错误!=总帐无错误)
{
fputs((char*)gluErrorString(err),stderr);
出口(1);
}
}

似乎顶点数组的顺序产生了三角形,其错误的面朝向您观察的点。您是否可以尝试从完全相反的一侧查看点,如(-10,-10,-10),或者更改顶点的顺序以匹配逆时针方向。现在看看中心,如果你能看到你的金字塔,它也支持我的观点;那就是你在金字塔里面,可见的面在里面看。我猜出来了。我忘了用glut注册我的整形函数。