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

合集下载

opengles 顶点理解

opengles 顶点理解

opengles 顶点理解摘要:1.简介2.OpenGL ES 顶点概念3.顶点属性4.顶点数组5.顶点缓冲对象6.总结正文:OpenGL ES(OpenGL for Embedded Systems)是一种为嵌入式系统设计的图形编程接口。

在OpenGL ES中,顶点是图形渲染的基本单元,负责描述物体的形状和纹理。

本文将详细介绍OpenGL ES顶点的相关知识。

2.OpenGL ES 顶点概念在OpenGL ES中,顶点(Vertex)是一个抽象的概念,它代表了一个三维空间中的点。

顶点可以是实心的,也可以是空心的,甚至可以是一个平面。

为了更好地表示顶点,我们需要为其定义一些属性。

3.顶点属性顶点属性(Vertex Attribute)是用来描述顶点特征的数据。

在OpenGL ES中,每个顶点可以包含以下属性:- 位置(Position):顶点在三维空间中的坐标。

- 颜色(Color):顶点的颜色,通常用RGBA表示。

- 纹理坐标(Texture Coordinate):顶点在纹理上的坐标。

- 法向量(Normal):顶点所在平面的法向量。

- 其他属性:根据实际需求,还可以定义其他属性,如顶点ID、权重等。

4.顶点数组顶点数组(Vertex Array)是一种数据结构,用于存储顶点属性的数据。

OpenGL ES提供了两种顶点数组:- 顶点数组对象(Vertex Array Object,VAO):是一个高级的顶点数组,可以保存顶点数组的状态,如顶点数组渲染属性等。

- 顶点数组缓冲(Vertex Array Buffer,VAB):是一个低级的顶点数组,用于存储顶点属性数据。

5.顶点缓冲对象顶点缓冲对象(Vertex Buffer Object,VBO)是一种用于存储顶点数据的数据结构。

VBO可以用于存储顶点数组、顶点数组缓冲和其他类型的顶点数据。

通过使用VBO,可以提高渲染性能,并减轻CPU的负担。

基于OpenGL视点坐标系的三维场景旋转算法

基于OpenGL视点坐标系的三维场景旋转算法
lisheng2361mebuaaeducn论文基于opengl视点坐标系与世界坐标系的相互对应关系建立以视点系参考点为中心的球坐标提出一种新的三维场景旋转算法模型该模型几何意义非常明确在拖动过程中可随时调整灵敏度在同等旋转条件下三维变化导矢保持恒定操作方便易行为人机三维旋转操作提供了新的有效途径
基于 OpenGL 视点坐标系的三维场景旋转算法
关系。 旋 转 时 , 可 考 虑 把 参 考 点 m_ref 指 向 场 景 中 心 , 其 余 六 个
值需要在旋转过程中加以控制, 其中的难点有二: 第一, 用 2 个 变化量( dx, dy) 来表达视点位置 m_eye( eyex, eyey, eyez) 的变化 量; 第二, 变化过程中保持视点和参考点的连线与视线向上方 向的垂直关系。旋转质量受三个指标控制: 控制量与旋转量的 几何意义; 旋转量相对于控制量的连续程度; 旋转量对控制量 的 导 数 连 续 程 度 。这 些 指 标 关 系 到 几 何 直 观 性 、连 续 旋 转 性 、灵 敏度。
( n+1)
Ye =
( n+1)
Ye
Abstr act: In this paper, based on correlation between eye coordinate system and world coordinate system of OpenGL, a new arithmetic model of 3D scene rotation is presented using spheric coordinate system of which origin is the reference point of eye coordinate system.The model has explicit geometrical signification, can adjust the sensitiveness freely during the dragging process and keep the 3D derivative vector invariant under the condition of tantamount rotation.It is operated expediently and provides a sound means for man- machine 3D rotation operation. Keywor ds: scene rotation, derivative vector invariant, sensitiveness, OpenGL

openGL+VS2010的例程--旋转立方体(三维)

openGL+VS2010的例程--旋转立方体(三维)

openGL+VS2010的例程--旋转⽴⽅体(三维)效果图如上:步骤:⾸先,设置模型视⾓往后退,再旋转视⾓;然后,⽤默认绘制⽴⽅体函数绘制;最后,利⽤空闲对模型做⾓度微调。

实现代码如下:1 #include <GL\glut.h>23 GLfloat xRotated, yRotated, zRotated;45void Display(void)6 {7 glClear(GL_COLOR_BUFFER_BIT);8 glLoadIdentity();9 glTranslatef(0.0,0.0,-4.0);10 glRotatef(xRotated,1.0,0.0,0.0);11 glRotatef(yRotated,0.0,1.0,0.0);12 glRotatef(zRotated,0.0,0.0,1.0);13//glScalef(2.0,1.0,1.0);14 glutWireCube(1.5);15 glFlush(); //Finish rendering16 glutSwapBuffers();17 }1819void Reshape(int x, int y)20 {21if (y == 0 || x == 0) return; //Nothing is visible then, so return22//Set a new projection matrix23 glMatrixMode(GL_PROJECTION);24 glLoadIdentity();25//Angle of view:40 degrees26//Near clipping plane distance: 0.527//Far clipping plane distance: 20.028 gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);29 glMatrixMode(GL_MODELVIEW);30 glViewport(0,0,x,y); //Use the whole window for rendering31 }32static int times = 0;33void Idle(void)34 {35 times++;36if(times >30000)37 times = 0;3839if(times %30000 == 0)40 {41 xRotated += 0.3;42 yRotated += 0.1;43 zRotated += -0.4;44 Display();45 }46 }474849int main (int argc, char **argv)50 {51//Initialize GLUT52 glutInit(&argc, argv);53 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //For animations you should use double buffering54 glutInitWindowSize(300,300);55//Create a window with rendering context and everything else we need56 glutCreateWindow("Cube example");57 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);58 xRotated = yRotated = zRotated = 0.0;59 glClearColor(0.0,0.0,0.0,0.0);60//Assign the two used Msg-routines61 glutDisplayFunc(Display);62 glutReshapeFunc(Reshape);63 glutIdleFunc(Idle);64//Let GLUT get the msgs65 glutMainLoop();66return0;67 }。

OpenGL旋转立方体

OpenGL旋转立方体

#include <math.h>#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <gl/glaux.h>#include <stdio.h>#include <io.h>#include <GL/glut.h>#define bool int#define false 0#define true 1#define M_PI 3.1415926int winWidth, winHeight;float angle = 0.0, axis[3], trans[3];bool trackingMouse = false;bool redrawContinue = false;bool trackballMove = false;/* Draw the cube */GLfloat vertices[][3] = {{-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} };GLfloat colors[][3] = {{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}};void polygon(int a, int b, int c , int d, int face){/* draw a polygon via list of vertices */glBegin(GL_POL YGON);glColor3fv(colors[a]);glVertex3fv(vertices[a]);glVertex3fv(vertices[b]);glVertex3fv(vertices[c]);glVertex3fv(vertices[d]);glEnd();}void colorcube(void){/* map vertices to faces */polygon(1,0,3,2,0);polygon(3,7,6,2,1);polygon(7,3,0,4,2);polygon(2,6,5,1,3);polygon(4,5,6,7,4);polygon(5,4,0,1,5);}/* These functions implement a simple trackball-like motion control */float lastPos[3] = {0.0F, 0.0F, 0.0F};int curx, cury;int startX, startY;void trackball_ptov(int x, int y, int width, int height, float v[3]){float d, a;/* project x,y onto a hemisphere centered within width, height */ v[0] = (2.0F*x - width) / width;v[1] = (height - 2.0F*y) / height;d = (float) sqrt(v[0]*v[0] + v[1]*v[1]);v[2] = (float) cos((M_PI/2.0F) * ((d < 1.0F) ? d : 1.0F));a = 1.0F / (float) sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);v[0] *= a;v[1] *= a;v[2] *= a;}void mouseMotion(int x, int y){float curPos[3], dx, dy, dz;trackball_ptov(x, y, winWidth, winHeight, curPos);if(trackingMouse){dx = curPos[0] - lastPos[0];dy = curPos[1] - lastPos[1];dz = curPos[2] - lastPos[2];if (dx || dy || dz) {angle = 90.0F * sqrt(dx*dx + dy*dy + dz*dz);axis[0] = lastPos[1]*curPos[2] - lastPos[2]*curPos[1];axis[1] = lastPos[2]*curPos[0] - lastPos[0]*curPos[2];axis[2] = lastPos[0]*curPos[1] - lastPos[1]*curPos[0];lastPos[0] = curPos[0];lastPos[1] = curPos[1];lastPos[2] = curPos[2];}}glutPostRedisplay();}void startMotion(int x, int y){trackingMouse = true;redrawContinue = false;startX = x; startY = y;curx = x; cury = y;trackball_ptov(x, y, winWidth, winHeight, lastPos);trackballMove=true;}void stopMotion(int x, int y){trackingMouse = false;if (startX != x || startY != y) {redrawContinue = true;} else {angle = 0.0F;redrawContinue = false;trackballMove = false;}}void display(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/* view transform */if (trackballMove){glRotatef(angle, axis[0], axis[1], axis[2]);}colorcube();glutSwapBuffers();}void mouseButton(int button, int state, int x, int y){if(button==GLUT_RIGHT_BUTTON) exit(0);if(button==GLUT_LEFT_BUTTON) switch(state){case GLUT_DOWN:y=winHeight-y;startMotion(x,y);break;case GLUT_UP:stopMotion(x,y);break;}}void myReshape(int w, int h){glViewport(0, 0, w, h);winWidth = w;winHeight = h;}void spinCube(){if (redrawContinue) glutPostRedisplay();}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(500, 500);glutCreateWindow("colorcube");glutReshapeFunc(myReshape);glutDisplayFunc(display);glutIdleFunc(spinCube);glutMouseFunc(mouseButton);glutMotionFunc(mouseMotion);glEnable(GL_DEPTH_TEST);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0);glMatrixMode(GL_MODELVIEW);glutMainLoop();}。

OpenGL+OpenCV实现立方体贴图

OpenGL+OpenCV实现立方体贴图

OpenGL+OpenCV实现⽴⽅体贴图
我⼬⾋芔茻,转眼就7⽉份了。

今天试了⼀下⽴⽅体贴图,⽐较简单,⼤概说下和平⾯贴图的区别。

1. 平⾯贴图需要的是纹理坐标vec2;⽴⽅体贴图需要的是⼀个⽅向向量vec3,长度没有关系,重要的是⽅向,OpenGL会根据⽅向向量与⽴⽅体的各个⾯的交点来采样纹理。

2.在⽴⽅体的六个⾯贴六张不同的图⽚,我⽤的⽅法是将六张图⽚读⼊到OpenCV的Mat数组中,需要从BGR转到RGB,然后⼀个⼀个去绑定纹理。

此时区别2D纹理的地⽅在于要是⽤GL_TEXTURE_CUBE_MAP,⽽不再是GL_TEXTURE_2D了。

可以⽤简单的for循环去⼀个个绑定纹理,纹理⽬标是枚举类型,依次加1。

3. 在顶点着⾊器中输出vec3的⽅向向量,在⽚段着⾊器中读⼊。

⽚段着⾊器中需要uniform ⼀个samplerCube ,⽽不是2D纹理中的sampler2D。

最后⽤texture函数去采样就⾏了。

4. 其他部分就不赘述了
渲染结果如下图
夜已深,就到此。

OpenGL顶点数组

OpenGL顶点数组

OpenGL顶点数组概述作为在⽴即模式(glBegin()与glEnd()之间)下指定单个顶点数据的替代,你可以保存顶点数据在⼀组列表中,包括顶点位置、法线、纹理坐标与颜⾊信息。

并且你可以通过索引数组解引⽤数组元素绘制选定的⼏何图元。

看看下⾯的⽤⽴即模式绘制⽴⽅体的代码。

glBegin(GL_TRIANGLES); // draw a cube with 12 triangles// 前⾯ =================glVertex3fv(v0); // v0-v1-v2glVertex3fv(v1);glVertex3fv(v2);glVertex3fv(v2); // v2-v3-v0glVertex3fv(v3);glVertex3fv(v0);// 右⾯ =================glVertex3fv(v0); // v0-v3-v4glVertex3fv(v3);glVertex3fv(v4);glVertex3fv(v4); // v4-v5-v0glVertex3fv(v5);glVertex3fv(v0);// 上⾯ ===================glVertex3fv(v0); // v0-v5-v6glVertex3fv(v5);glVertex3fv(v6);glVertex3fv(v6); // v6-v1-v0glVertex3fv(v1);glVertex3fv(v0);... // 绘制其余3⾯glEnd();为构造每个⾯的2个三⾓形,需要调⽤glVertex*()6次。

例如,正⾯分为v0-v1-v2与v2-v3-v0两个三⾓形。

⼀个⽴⽅体有6个⾯,因此glVertex* ()的调⽤次数为36。

如果你还需为相关顶点指定法线、纹理坐标与颜⾊,这增加对OpenGL函数的调⽤。

另⼀个需要注意的是:顶点“v0”被三个相邻的⾯共⽤:正⾯、右⾯与顶⾯。

基于OpenGL的3D旋转魔方实现讲解

基于OpenGL的3D旋转魔方实现讲解

华中科技大学电子科学与技术系课程设计报告( 2010-- 2011年度第2 学期)名称:软件课程设计题目:基于OpenGL的3D旋转魔方实现院系:班级:学号:学生姓名:指导教师:设计周数:成绩:日期:年月日目录1.课程设计介绍............................................................................................ (2)1.1目的.............................................................................................................. (2)1.2内容.............................................................................................................. (2)1.3取得的成果 (2)2.程序分析..................................................................................................... (3)2.1 程序原理 (3)2.2 程序流程 (4)2.3 数据结构 (13)2.4 重要函数 (13)3.程序分析与结果演示 (16)3.1 成果演示 (16)3.2 程序分析 (17)4.出现过的问题 (18)5.心得和小节 (19)1.课程设计介绍1.1目的21世纪是高科技时代,是信息技术时代,而计算机技术无疑会引领各行各业,为我们带来一个全新的时代。

作为新世纪的接班人,我们必须拥有良好的计算机应用能力,才能跟上世界发展的大流,不至于在激烈的竞争中被淘汰。

而程序作为计算机的灵魂,因此编程能力对当代大学生来说至关重要。

opengl中旋转公式推导

opengl中旋转公式推导

opengl中旋转公式推导OpenGL是一个用于渲染2D和3D图形的开放式图形库。

在OpenGL中,旋转是一种常见的变换操作,用于将对象绕某个轴旋转一定角度。

本文将推导出OpenGL中旋转的公式,并解释其原理和应用。

在OpenGL中,旋转变换是通过一个旋转矩阵来实现的。

旋转矩阵可以描述物体绕某个轴旋转一定角度后的新位置。

假设我们要将一个物体绕原点的Z轴旋转,旋转角度为θ。

那么旋转矩阵可以表示为:R = | cosθ -sinθ 0 || sinθ cosθ 0 || 0 0 1 |其中,cosθ表示θ的余弦值,sinθ表示θ的正弦值。

通过将物体的顶点坐标与旋转矩阵相乘,可以得到旋转后的新顶点坐标。

下面我们来推导一下这个旋转矩阵的公式。

假设物体的原始坐标为P(x, y, z),旋转后的新坐标为P'(x', y', z')。

我们可以表示P为一个列向量:P = | x || y || z |旋转矩阵R作用于P,得到P'的计算公式为:P' = R * P展开矩阵乘法,可以得到:P' = | cosθ -sinθ 0 | * | x || y || z |经过计算,可以得到:x' = x * cosθ - y * sinθy' = x * sinθ + y * cosθz' = z这就是物体绕Z轴旋转θ角度后的新坐标公式。

同样的,我们可以推导出绕X轴和Y轴旋转的公式,分别为:绕X轴旋转:x' = xy' = y * cosθ - z * sinθz' = y * sinθ + z * cosθ绕Y轴旋转:x' = x * cosθ + z * sinθy' = yz' = -x * sinθ + z * cosθ这三个公式分别描述了物体绕X轴、Y轴和Z轴旋转后的新坐标计算方式。

在OpenGL中,我们可以通过调用旋转函数来实现物体的旋转变换。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用顶点数组旋转立方体
• 1、先利用顶点列表创建一个立方体模型: 顶点数组可以把对象的绘制信息封装在一个包含 数据结构里,只要几次函数调用就可以绘制多面 体对象。因为openGL允许定义包含顶点信息的数 据结构(数组),我们只需要向openGL发出请求, openGL只需通过几次函数调用就可以遍历整个数 据结构。
参数意义:三维对象的颜色,顶点浮点数据 类型,数据元素间隔为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 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);//模型观视矩阵 • }



• • • • • •
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(); }
•通过函数调用激活颜色数组和顶点数组:
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
•接着说明数组变量存放格式:
glVertexPointer(3,GL_FLOAT,0,vertices); glColorPointer(3,GL_FLOAT,0,colors);
• 在显示回调函数里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每四个顶点画一个四边形
• 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};//颜色数组
• 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) • {
• • • • • •
• • • •
• • • •
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
• 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);//设置模式 • glutInitWindowSize(500, 500);//窗口大小 • glutCreateWindow("colorcube"); • glutReshapeFunc(myReshape);//注册重画回调 • glutDisplayFunc(display);//三个回调函数(显示回调) • glutIdleFunc(spinCube); • glutMouseFunc(mouse); • glEnable(GL_DEPTH_TEST);//启用隐藏-面-消去
• 为了绘制六个正方形,需要为每个正方形 指定四个顶点,最终需要指定6*4=24个顶 点。但一个立方体其实总共只有八个顶点, 要指定24次,就意味着每个顶点其实重复 使用了三次,像这样重复烦琐的代码,稍 有不慎,即使相同的顶点也可能被指定成 不同的顶点了。 • 如果我们定义一个数组,把八个顶点都放 到数组里,然后每次指定顶点都使用指针, 而不是使用直接的数据,这样就避免了在 指定顶点时考虑大量的数据,于是减少了 代码出错的可能性。
利用顶点数组旋转立方体程序:
• • • • • • • #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个顶点在定点数组里的索引 号到一个数组里,或将要使用的顶点的序号保存到一个数组 里面
相关文档
最新文档