想用opengl做渐变正方体,代码不知道还有什么问题,运行显示不出来

#include <math.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#include <GL/gl.h>
#include <GL/glut.h>

#define PI 3.1415926
int WinWidth, WinHeight;
int tM=0;

// 旋转角度,初始可以随便设置
float rotateX = 10;float rotateY = 20;float rotateZ =10;
float moveX=20;float moveY=20;float moveZ=20;
float scaleX=10;float scaleY=10;float scaleZ=10;
float eyeX=50;float eyeY=20;float eyeZ=20;

// 立方体的8个顶点坐标   世界坐标系的坐标 GL_MODELVIEW
GLfloat vertex_list[8][3] = {
    -0.5f, -0.5f, -0.5f,
    0.5f, -0.5f, -0.5f,
    -0.5f, 0.5f, -0.5f,
    0.5f, 0.5f, -0.5f,
    -0.5f, -0.5f, 0.5f,
    0.5f, -0.5f, 0.5f,
    -0.5f, 0.5f, 0.5f,
    0.5f, 0.5f, 0.5f,
};

GLint index_list[6][4] = {
    0, 2, 3, 1,
    0, 4, 6, 2,
    0, 1, 5, 4,
    4, 5, 7, 6,
    1, 3, 7, 5,
    2, 6, 7, 3,
};

// 设置旋转 表示绕旋转轴(0, 0, 0) ~ (x, y, z)旋转th角度
// 定义不同的颜色
GLfloat colors[][3] = { { 0.0, 0.0, 1.0 }, { 0.0, 1.0, 0.0 }, { 1.0, 0.0, 0.0 },
{ 1.0, 0.0, 1.0 }, { 1.0, 1.0, 0.0 }, { 0.0, 1.0, 1.0 },
{ 1.0, 0.5, 0.5 }, { 0.0, 0.5, 0.5 },{ 0.0, 0.0, 0.0 },{ 1.0, 1.0, 1.0 },{ 0.5, 0.5, 0.5 } ,{ 0.9, 0.7, 0.5 } };

void DrawHexahedron(void)
{
int i, j;GLfloat cx,cy,cz;
glShadeModel(GL_SMOOTH);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_QUADS); // 绘制四边形
for (i = 0; i < 6; ++i) // 有六个面,循环六次
{
glColor3f(colors[i][0], colors[i][1], colors[i][2]);
for (j = 0; j < 4; ++j) // 每个面有四个顶点,循环四次
{
glVertex3fv(vertex_list[index_list[i][j]]);
}
}
glEnd();

glutSwapBuffers();

}
void Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(15,1.0f,0.0f,0.0f);
glRotatef(15,0.0f,1.0f,0.0f);
if (tM==1)glTranslatef(moveX,moveY,moveZ);
if (tM==2)
{
glRotatef(rotateX,1.0f,0.0f,0.0f);
glRotatef(rotateY,0.0f,1.0f,0.0f);
glRotatef(rotateZ,0.0f,0.0f,1.0f);
}
if(tM==3)glScalef(scaleX,scaleY,scaleZ);
DrawHexahedron();
glBegin(GL_LINES);
glColor3f(1,0,0);
glVertex3f(0,0,0);glVertex3f(1,0,0);
glColor3f(0,1,0);
glVertex3f(0,0,0);glVertex3f(0,1,0);
glColor3f(0,0,1);
glVertex3f(0,0,0);glVertex3f(0,0,1);

glutSwapBuffers();
}
void Reshape(int w, int h)
{
WinWidth = w;
WinHeight = h;
// //改变显示区域,起始位置为客户端窗口左下角(非坐标原点)
glViewport(0, 0, w, h);

glMatrixMode(GL_PROJECTION);  //投影变换模式
glLoadIdentity();             //投影变换矩阵初始化
//设置透视投影: 宽高比改为当前值,视线区域与屏幕大小一致;
gluPerspective(15, 1.0*WinWidth / WinHeight, 10, 1000);

// 开启更新深度缓冲区的功能
glEnable(GL_DEPTH_TEST);  //该句注释掉也可以
// 摄像机视图观看,从 (x:0,y:5,z:20) 往(000)处看,(010)为正方向
gluLookAt(0, 5, 20, 0, 0, 0, 0, 1, 0);

glMatrixMode(GL_MODELVIEW);  //模型变换
glLoadIdentity;

}
void SpecialKeys(int key, int x, int y)
{ char str[100];/ar *str1,*str2,str3;
if (tM==1)
{ if (key == GLUT_KEY_UP) moveY -= 5.0f;
if (key == GLUT_KEY_DOWN) moveY += 5.0f;
if (key == GLUT_KEY_LEFT) moveX -= 5.0f;
if (key == GLUT_KEY_RIGHT) moveX += 5.0f;
if (key == GLUT_KEY_PAGE_UP) moveZ -= 5.0f;
if (key == GLUT_KEY_PAGE_DOWN) moveZ += 5.0f;
sprintf(str,"XYZ平移量:%4.1f,%4.1f,%4.1f",moveX,moveY,moveZ);
glutSetWindowTitle(str);
}
if(tM==2)
{
if (key == GLUT_KEY_UP) rotateX -= 5.0f;
if (key == GLUT_KEY_DOWN) rotateX += 5.0f;
if (key == GLUT_KEY_LEFT) rotateY -= 5.0f;
if (key == GLUT_KEY_RIGHT) rotateY += 5.0f;
if (key == GLUT_KEY_LEFT) rotateY -= 5.0f;
if (key == GLUT_KEY_PAGE_UP) rotateZ -= 5.0f;
if (key == GLUT_KEY_PAGE_DOWN) rotateZ += 5.0f;
if (rotateX > 356.0f) rotateX = 0.0f;
if (rotateX < -1.0f) rotateX = 355.0f;
if (rotateY > 356.0f) rotateY = 0.0f;
if (rotateY < -1.0f) rotateY = 355.0f;
sprintf(str,"在初始旋转基础上,XYZ旋转度:%4.1f,%4.1f,%4.1f",rotateX,rotateY,rotateZ);
glutSetWindowTitle(str);
}
if(tM==3)
{
if (key == GLUT_KEY_UP) scaleY = 5.0f;
if (key == GLUT_KEY_DOWN) scaleY= 5.0f;
if (key == GLUT_KEY_LEFT) scaleX = 5.0f;
if (key == GLUT_KEY_RIGHT) scaleX = 5.0f;
if (key == GLUT_KEY_PAGE_UP) scaleZ= 5.0f;
if (key == GLUT_KEY_PAGE_DOWN) scaleZ= 5.0f;
sprintf(str,"XYZ缩放比:%4.1f,%4.1f,%4.1f",scaleX,scaleY,scaleZ);
glutSetWindowTitle(str);
}
if(tM==4)
{
if (key == GLUT_KEY_UP) eyeY = 5.0f;
if (key == GLUT_KEY_DOWN) eyeY= 5.0f;
if (key == GLUT_KEY_LEFT) eyeX = 5.0f;
if (key == GLUT_KEY_RIGHT) eyeX = 5.0f;
if (key == GLUT_KEY_PAGE_UP) eyeZ= 5.0f;
if (key == GLUT_KEY_PAGE_DOWN) eyeZ= 5.0f;
glMatrixMode(GL_PROJECTION); //投影变换模式
glLoadIdentity(); //投影变换矩阵初始化
//设置透视投影: 宽高比改为当前值,视线区域与屏幕大小一致;
gluPerspective(15, 1.0
WinWidth / WinHeight, 10, 1000);

// 开启更新深度缓冲区的功能
glEnable(GL_DEPTH_TEST);  //该句注释掉也可以
// 摄像机视图观看,从 (x:0,y:5,z:20) 往(0,0,0)处看,(0,1,0)为正方向
gluLookAt(0, 5, 20, 0, 0, 0, 0, 1, 0);

glMatrixMode(GL_MODELVIEW);  //模型变换
glLoadIdentity;
sprintf(str,"相机位置 :%4.1f,%4.1f,%4.1f",eyeX,eyeY,eyeZ);
glutSetWindowTitle(str);

}
if(key == GLUT_KEY_F1){glutSetWindowTitle("F1:平移");tM=1;}
if(key == GLUT_KEY_F2){glutSetWindowTitle("F2:旋转");tM=2;}
if(key == GLUT_KEY_F3){glutSetWindowTitle("F3:缩放");tM=3;}
if(key == GLUT_KEY_F4){glutSetWindowTitle("F4:挪动相机");tM=4;}
//刷新窗口
glutPostRedisplay();
}

int main(int argc, char *argv[])
{
WinWidth = 800;
WinHeight = 800;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE);
//glutInitWindowPosition(100, 100);
glutInitWindowSize(WinWidth, WinHeight);
glutCreateWindow("HelloOpenGL");

glutReshapeFunc(&Reshape);//窗口改变的时候调用的函数
glutDisplayFunc(&DrawHexahedron);
glutDisplayFunc(&Draw);
//注册键盘响应事件
glutSpecialFunc(SpecialKeys);

glutMainLoop();
return 0;

}

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。