openGL利用顶点数组旋转立方体以及程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用顶点数组旋转立方体程序:
• • • • • • • #include <math.h> #include <stdio.h> #include<stdlib.h> #include <GL/glut.h> #include<graphics.h> #include <conio.h> GLfloat vertices[]={-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,1.0,1.0, -1.0,1.0,-1.0, -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, 1.0,1.0,1.0};//立方体的顶点数组并设为全局变量 • GLfloatcolors[]={0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,1. 0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0};//颜色 数组并设为全局变量 • GLubytecubeIndices[]={0,3,2,1,2,3,7,6,0,4,7,3,1,2,6,5,4, 5,6,7,0,1,5,4}; //保存6个面的24个顶点在定点数组里的索引 号到一个数组里,或将要使用的顶点的序号保存到一个数组 里面
• void myReshape(int w, int h) • { • glViewport(0, 0, w, h);//定义三维观视体 • glMatrixMode(GL_PROJECTION);//投影模式 • glLoadIdentity();//初始化 • if (w <= h) • glOrtho(-4.0, 4.0, -3.0 * (GLfloat) h / (GLfloat) w, • 5.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); • else • glOrtho(-4.0 * (GLfloat) w / (GLfloat) h, • 4.0 * (GLfloat) w / (GLfloat) h, -3.0, 5.0, -10.0, 10.0); • glMatrixMode(GL_MODELVIEW);//模型观视矩阵 • }
• void spinCube()//旋转 • { • theta[axis]+=0.01;//空闲回调函数每次执行时,相应旋转轴的 旋转角度增加0.01度 • if(theta[axis]>360.0) theta[axis]-=360.0; • glutPostRedisplay();//重画 • } • void mouse(int btn, int state, int x, int y) • { • //鼠标回调函数用来选择旋转轴 • if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)axis=0; • if(btn==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN)axis=1; • if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)axis=2; • }//回调重画 • void myReshape(int w, int h) • {
• 2、使用顶点数组的三个步骤:
第一步:激活顶点数组功能; 第二步:告诉openGL定点数组的位置和存放 格式; 第三步:绘制对象。 前两步可以看做是初始化过程的一部分,第三 步则是显示回调函数的一部分。
• •


• •
OpenGL可以使用6种不同类型的数组:顶点、 颜色、颜色索引、法向、贴图坐标和边标志位。 这6类数组对应于glBegin()和glEnd()之间可以 设置的6类不同数据项,而旋转立方体只需要颜 色和顶点数组,并把它们设为全局变量。 GLfloat vertices[]={-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,1.0,-1.0, -1.0,1.0,-1.0, -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, 1.0,1.0,1.0};//顶点数组 GLfloatcolors[]={0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0 .0,0.0,1.0,0.0,0.0,0.0,1.0, 1.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0};//颜色数组
•通过函数调用激活颜色数组和顶点数组:
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
•接着说明数组变量存放格式:
glVertexPointer(3,GL_FLOAT,0,vertices); glColorPointer(3,GL_FLOAT,0,colors);
• 为了绘制六个正方形,需要为每个正方形 指定四个顶点,最终需要指定6*4=24个顶 点。但一个立方体其实总共只有八个顶点, 要指定24次,就意味着每个顶点其实重复 使用了三次,像这样重复烦琐的代码,稍 有不慎,即使相同的顶点也可能被指定成 不同的顶点了。 • 如果我们定义一个数组,把八个顶点都放 到数组里,然后每次指定顶点都使用指针, 而不是使用直接的数据,这样就避免了在 指定顶点时考虑大量的数据,于是减少了 代码出错的可能性。
参数意义:三维对象的颜色,顶点浮点数据 类型,数据元素间隔为0连续存放,数组指针
• 必须用自己定义的数据类型向openGL提供 立方体的顶点与表面之间的关系,则需要 定义一个数组,保存6个面的24个顶点在 定点数组里的索引号,并将这个数组定义 为全局变量: GLubytecubeIndices[]={0,3,2,1,2,3,7,6,0,4, 7,3,1,2,6,5,4,5,6,7,0,1,5,4}; 即第一个面由索引号为(0,3,2,1)的4 个 顶点构成,第二个面由索引号为 (2,3,7,6)4个顶点构成,以此类推。 要注意:顶点的次序必须符合多边形外侧 面要求。
• void key(unsigned char k,int x,int y) • { • if(k=='1')glutIdleFunc(spinCube);
• if(k=='2')glutIdleFunc(NULL); • if(k=='q')exit(0); • } • void main(int argc, char **argv)//主函数 • { • glutInit(&argc, argv); • glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//设置模式 • glutInitWHale Waihona Puke BaidundowSize(500, 500);//窗口大小 • glutCreateWindow("colorcube"); • glutReshapeFunc(myReshape);//注册重画回调 • glutDisplayFunc(display);//三个回调函数(显示回调) • glutIdleFunc(spinCube); • glutMouseFunc(mouse); • glEnable(GL_DEPTH_TEST);//启用隐藏-面-消去
• • • • • •
• • • •
• • • •
static GLfloat theta[]={0.0,0.0,0.0};//绘制立方体 static GLint axis=2; void display(void) { //display()函数利用鼠标回调函数确定3个角度 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();//初始化,清空帧缓存和深度缓存 gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);//观视点 glTranslatef(0.0,3.0,0.0);//将立方体平移到(0,3,0) glRotatef(theta[0],1.0,0.0,0.0);//将物体绕经过(1,0,0)的矢量逆 时针旋转theta[]的角度 glRotatef(theta[1],0.0,1.0,0.0); glRotatef(theta[2],0.0,0.0,1.0); glColorPointer(3,GL_FLOAT,0,colors); glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,cub



• • • • • •
glEnableClientState(GL_COLOR_ARRAY);// 调用颜色数组 glEnableClientState(GL_VERTEX_ARRAY);// 调用顶点数组 glVertexPointer(3,GL_FLOAT,0,vertices);//定 点数组变量存放格式 //参数意义:三维对象的颜色,顶点浮点数据类 型,数据元素间隔为0连续存放,数组指针 glColorPointer(3,GL_FLOAT,0,colors);//颜色 数组变量存放格式 glClearColor(1.0,1.0,1.0,1.0); glColor3f(1.0,1.0,1.0); glutMainLoop(); }
利用顶点数组旋转立方体
• 1、先利用顶点列表创建一个立方体模型: 顶点数组可以把对象的绘制信息封装在一个包含 数据结构里,只要几次函数调用就可以绘制多面 体对象。因为openGL允许定义包含顶点信息的数 据结构(数组),我们只需要向openGL发出请求, openGL只需通过几次函数调用就可以遍历整个数 据结构。
• 在显示回调函数里6次调用glDraw Elements()函数,每次绘制一个表面: for(i=0;i<=6;i++) glDrawElement(GL_POLYGON,4, GL_UNSIGNED_BYTE,&cubeIndices[4*i]); 当定义好数组并已经初始化顶点数组,每次绘制立 方体只需要6次函数调用。如果每个面都是四边形, 采用GL_QUADS而不是GL_POLYGON,可以提 高绘制速度,只需要一次函数调用: glDrawElements(GL_QUADS,24, GL_UNSIGNED_BYTE,cubeIndices); 因为GL_QUADS每四个顶点画一个四边形
相关文档
最新文档