Bezier曲面.doc_第1页
Bezier曲面.doc_第2页
Bezier曲面.doc_第3页
Bezier曲面.doc_第4页
Bezier曲面.doc_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8 一、设计实验目的通过实验可以更了解Bezier曲线曲面的概念,理解Bezier曲面生成的原理,加深对Bezier生成算法的理解,加强理论的学习,锻炼对知识的运用能力和实践能力;进一步对OpenGL强大功能的认识,并对一些函数如display()、makeImage()、init() 、reshape(int w, int h)等的功能的运用又进一步的了解,为以后的学习打下基础。二、设计实验要求呈现Bezier曲面,并使其能够旋转和平移 三、实验原理本程序用Visual C+ Win32 Console Applicstion(32控制台应用程序)创建一个应用程序,再添加一个c+程序源Bezier曲面。绘制Bezier曲面主要运用多个多边形逼近而成,并通过少数几个控制点对其进行描述。通过定义曲面和均匀网格绘制一个具有光照和明暗处理效果的Bezier曲面,并实现曲面的放大和缩小,绕x轴,y轴,z轴旋转四、算法分析:下面给出程序中主函数中各函数功能说明: glutInit(&argc, argv)初始化GLUT,用来接收来自main函数的参数,程序可以具体实现相关方式来使用这些参数。 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH)颜色缓存的缓存模式,用于显示图形的颜色; glutInitWindowSize (1000, 600)函数功能是创建一个窗口大小为(1000,600); glutInitWindowPosition (30, 40)函数是所创建的窗口的(0,0)坐标在电脑窗口(30,40)出显示出来; glutCreateWindow (argv0)函数的功能实在屏幕上创建一个窗口; glutDisplayFunc(display)函数display在每次对窗口重绘时使用; glutReshapeFunc(reshape) 函数主要是改变窗口大小的操作进行重绘; glutMainLoop()是程序进入无限事件处理循环计算函数,该函数的调用应为main函数最后一条语句出现。下面是各函数中的组成函数功能说明:定义控制点坐标数组: GLfloat ctrlpoints443 绘制曲面(包含的代码描述了所要绘制的Bezier曲面)函数: display()生成图形的纹理函数: makeImage()负责状态变量初始化的函数: init()改变窗口大小的操作进行重绘的函数: reshape()程序进入无限事件处理循环计算函数: glutMainLoop()glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)主要定义窗口底面颜色 void glEvalMesh2(GLenum mode,GLint p1,GLint p2,GLint q1,GLint q2) 的mode参数除了可以是GL_POINT和GL_LINE外,也可以是GL_FILL(生成填充空间曲面)。void glMap2fd(GLenum target,TYPE u1,TYPE u2,GLint ustride,GLint uorder,TYPE v1,TYPE v2,Glint vstride,GLint vorder,TYPE points);这里target的意义与在glMap1*()中的意义相同;(u1,u2),(v1,v2)是二维曲面坐标;其他参数如uorder,vorder,ustride和vstride等的定义都类似于在曲线中的定义;points为控制点坐标。对曲面任意一点的计算可通过函数 void glEvalCoord2fdv(TYPE u,TYPE v);来完成,通过在定义域内的曲线坐标值u,v来计算曲面内任意一点的世界坐标位置。对于曲面,也可以象曲线一样通过函数来定义均匀间隔的曲面坐标值: void glMapGrid2fd(GLenum nu,TYPE u1,TYPE u2, GLenum nv,TYPE v1,TYPE v2); 该函数定义曲面参数空间均匀网格,从u1到u2分为等间隔nu步,从v1到v2分为等间隔nv步,然后由glEvalMesh2()将此网格应用到已经启动的曲面计算上。 一般来说,纹理图像为正方形或长方形。但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理的单个纹素很少对应于屏幕图像上的象素。根据所用变换和所用纹理映射,屏幕上单个象素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小)。下面用函数glTexParameteri()说明放大和缩小的方法:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); 实际上,第一个参数可以是GL_TEXTURE_1D或GL_TEXTURE_2D,即表明所用的纹理是一维的还是二维的;第二个参数指定滤波方法,其中参数值GL_TEXTURE_MAG_FILTER指定为放大滤波方法,GL_TEXTURE_MIN_FILTER指定为缩小滤波方法。若选择GL_NEAREST则采用坐标最靠近象素中心的纹素,这有可能使图像走样;若选GL_LINEAR则采用最靠近象素中心的四个象素的加权平均值。GL_NEAREST所需计算比GL_LINEAR要少,因而执行得更快,但GL_LINEAR提供了比较光滑的效果。 GLfloat ambient4 = 0.8, 0.6, 0.4, 1.0定义 初始化光照、材质的过程 GLfloat position4 = 0.0, 1.0, 3.0, 1.0为定义一个黄色光源 GLfloat mat_diffuse4 = 0.8, 0.2, 0.1, 1.0是定义特定颜色的镜面反射 GLfloat mat_specular4 = 0.8, 0.6, 0.3, 1.0是定义镜面反射的光亮度 GLfloat mat_shininess1 = 60.0为光源发光的角度五、源程序:#include #include #include GLfloat ctrlpoints443 = /控制点坐标 -1.5, -1.5, 4.0, -0.5, -1.5, 2.0, 0.5, -1.5, -1.0, 1.5, -1.5, 2.0, -1.5, -0.5, 1.0, -0.5, -0.5, 3.0, 0.5, -0.5, 0.0, 1.5, -0.5, -1.0, -1.5, 0.5, 4.0, -0.5, 0.5, 0.0, 0.5, 0.5, 3.0, 1.5, 0.5, 4.0, -1.5, 1.5, -2.0, -0.5, 1.5, -2.0, 0.5, 1.5, 0.0, 1.5, 1.5, -1.0;GLfloat theta3=0.0,0.0,0.0;GLfloat d=0;GLfloat texpts222 = 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0;void display(void) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glEvalMesh2(GL_FILL, 0, 20, 0, 20); glFlush(); glutSwapBuffers();#defineimageWidth 64#defineimageHeight 64GLbyte image3*imageWidth*imageHeight;void makeImage(void) int i, j; float ti, tj; for (i = 0; i imageWidth; i+) ti = 2.0*3.14159265*i/imageWidth; for (j = 0; j 360) theta0-=360; glRotatef(theta0, 1.0, 0.0, 0.0); glutPostRedisplay(); break;case y: case Y:theta1+=5;if(theta1360) theta1-=360;glRotatef(theta1, 0.0, 10.0, 0.0);glutPostRedisplay();break;case z: case Z:theta2+=5;if(theta2360) theta2-=360;glRotatef(theta2, 0.0, 0.0, 1.0);glutPostRedisplay();break; default: break; void reshape(int w, int h) glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w = h) glOrtho(-4.0, 4.0, -4.0*(GLfloat)h/(GLfloat)w, 4.0*(GLfloat)h/(GLfloat)w, -4.0, 4.0); else glOrtho(-4.0*(GLfloat)w/(GLfloat)h, 4.0*(GLfloat)w/(GLfloat)h, -4.0, 4.0, -4.0, 4.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(85.0, 1.0, 1.0, 1.0);int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (800, 600)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论