




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、利用顶点数组旋转立方体 1、先利用顶点列表创建一个立方体模型: 顶点数组可以把对象的绘制信息封装在一个包含数据结构里,只要几次函数调用就可以绘制多面体对象。因为openGL允许定义包含顶点信息的数据结构(数组),我们只需要向openGL发出请求,openGL只需通过几次函数调用就可以遍历整个数据结构。 为了绘制六个正方形,需要为每个正方形为了绘制六个正方形,需要为每个正方形指定四个顶点,最终需要指定指定四个顶点,最终需要指定6*4=24个顶个顶点。但一个立方体其实总共只有八个顶点,点。但一个立方体其实总共只有八个顶点,要指定要指定24次,就意味着每个顶点其实重复次,就意味着每个顶点其实重复使用
2、了三次,像这样重复烦琐的代码,稍使用了三次,像这样重复烦琐的代码,稍有不慎,即使相同的顶点也可能被指定成有不慎,即使相同的顶点也可能被指定成不同的顶点了。不同的顶点了。 如果我们定义一个数组,把八个顶点都放如果我们定义一个数组,把八个顶点都放到数组里,然后每次指定顶点都使用指针,到数组里,然后每次指定顶点都使用指针,而不是使用直接的数据,这样就避免了在而不是使用直接的数据,这样就避免了在指定顶点时考虑大量的数据,于是减少了指定顶点时考虑大量的数据,于是减少了代码出错的可能性。代码出错的可能性。 2、使用顶点数组的三个步骤:、使用顶点数组的三个步骤: 第一步:激活顶点数组功能; 第二步:告诉op
3、enGL定点数组的位置和存放格式; 第三步:绘制对象。 前两步可以看做是初始化过程的一部分,第三步则是显示回调函数的一部分。 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
4、,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,ve
5、rtices); glColorPointer(3,GL_FLOAT,0,colors); 参数意义:三维对象的颜色,顶点浮点数据参数意义:三维对象的颜色,顶点浮点数据类型,数据元素间隔为类型,数据元素间隔为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 个顶点构
6、成,第二个面由索引号为(2,3,7,6)4个顶点构成,以此类推。 要注意:顶点的次序必须符合多边形外侧面要求。 在显示回调函数里在显示回调函数里6次调用次调用glDraw Elements()函数,每次绘制一个表面:函数,每次绘制一个表面: for(i=0;i=6;i+) glDrawElement(GL_POLYGON,4, GL_UNSIGNED_BYTE,&cubeIndices4*i); 当定义好数组并已经初始化顶点数组,每次绘制立当定义好数组并已经初始化顶点数组,每次绘制立方体只需要方体只需要6次函数调用。如果每个面都是四边形,次函数调用。如果每个面都是四边形,采用采用GL_
7、QUADS而不是而不是GL_POLYGON,可以提,可以提高绘制速度,只需要一次函数调用:高绘制速度,只需要一次函数调用: glDrawElements(GL_QUADS,24, GL_UNSIGNED_BYTE,cubeIndices); 因为因为GL_QUADS每四个顶点画一个四边形每四个顶点画一个四边形利用顶点数组旋转立方体程序:利用顶点数组旋转立方体程序: #include #include #include #include #include #include GLfloat vertices=-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,1.0,-1.0,
8、-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
9、,4; /保存保存6个面的个面的24个顶点在定点数组里的索引个顶点在定点数组里的索引号到一个数组里,或将要使用的顶点的序号保存到一个数组号到一个数组里,或将要使用的顶点的序号保存到一个数组里面里面 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();/初始化,
10、清空帧缓存和深度缓存初始化,清空帧缓存和深度缓存 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(theta0,1.0,0.0,0.0);/将物体绕经过将物体绕经过(1,0,0)的矢量逆的矢量逆时针旋转时针旋转theta的角度的角度 glRotatef(theta1,0.0,1.0,0.0); glRotatef(theta2,0.0,0.0,1.0); glColorPointer(3,GL_FLOAT,0,co
11、lors); glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,cubeIndices);/函数调用,函数调用,GL_QUADS每四个顶点画一个四边形每四个顶点画一个四边形 glutSwapBuffers();/交换缓存交换缓存 void spinCube()/旋转旋转 thetaaxis+=0.01;/空闲回调函数每次执行时,相应旋转轴的空闲回调函数每次执行时,相应旋转轴的旋转角度增加旋转角度增加0.01度度 if(thetaaxis360.0) thetaaxis-=360.0; glutPostRedisplay();/重画重画 void mouse
12、(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) void myReshape(int w, int h) glViewp
13、ort(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
14、.0, 10.0); glMatrixMode(GL_MODELVIEW);/模型观视矩阵模型观视矩阵 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);/设置模式设置模式 glutI
15、nitWindowSize(500, 500);/窗口大小窗口大小 glutCreateWindow(colorcube); glutReshapeFunc(myReshape);/注册重画回调注册重画回调 glutDisplayFunc(display);/三个回调函数(显示回调)三个回调函数(显示回调) glutIdleFunc(spinCube); glutMouseFunc(mouse); glEnable(GL_DEPTH_TEST);/启用隐藏启用隐藏-面面-消去消去 glEnableClientState(GL_COLOR_ARRAY);/调调用颜色数组用颜色数组 glEnableClientState(GL_VERTEX_ARRAY);/调用顶点数组调用顶点数组 glVertexPointer(3,GL_FLOAT,0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融科技助推银行网点数字化转型策略
- 香蕉购销合同协议书范本
- 砂石出售合同协议书范本
- 2025秋五年级上册语文(统编版)-【27 我的长生果】作业课件
- 煤炭产品买卖合同协议书
- 健身房协议书合同
- 购房合同转卖协议书范本
- 成都智能电表项目商业计划书模板范文
- 拟定合同签约协议书怎么写
- 铅酸蓄电池公司绿色建筑方案分析(范文)
- 2关于更换现场项目经理的函
- 部编版小学道德与法治四年级下册期末复习简答及分析题专练(含答案)
- 电子商务那些事学习通超星课后章节答案期末考试题库2023年
- 环境及理化因素损伤-冻伤
- Unit7SeasonPartALetslearn(教学设计)闽教版英语四年级下册
- 世界文化遗产武当山古建筑群的资料
- 医院医疗设备采购项目HIS系统及硬件采购投标文件
- 【橡胶工艺】-橡胶产品生产工艺规程
- 推销实战技巧与客户优秀服务技巧
- 福建新费用定额交底材料
- 器质性精神障碍患者的护理
评论
0/150
提交评论