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