版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1贝齐尔曲面设计1.1贝齐尔曲面定义设Pj(0,1,n; j = 0,1,m)为(n +1) 乂(m +1)个空间点列,则mXn次Bezier曲面定义为:P(u, v)=世 n P B (u)B (v)i=0 j=0u, V G 0,1(式 2-1)其中 B (u) = Ci ui (1 - u)m-i接点列中相邻两点所形成的空间网格 Bezier曲面的矩阵表示式是:气q,” ” 是Bernstein基函数。依次用线段连称之为特征网格。P(u,V) = B0 (u),B (u),B(u )-1P00P10P01P11P0 mP1m气(V)B (v)1,mPn1PnmBn m (V)(式 2-2
2、)在一般实际应用中,n、m(1)双线性Bezier曲面当m=n=1时不大于4。(u) B(w) pu, w 0,1(式 2-3)定义一张双线性Bezier曲面。已知四个角点之后,则0S (u, w) = (1 - w)(1 - u) + (1 - u) p0001+ (1 - w)up uwp 、1011(式 2-4)(2)双二次Bezier曲面当 m=n=2 时S(u, w) = y B.,2(u)Bj,2(w)p.i=0 j=0,W G0,l(式 2-5)由此式定义的曲面,其边界曲线及参数坐标曲线均为抛物线。(3)双三次Bezier曲面当m=n=3时S(u, w) = 22 B.,3(u)
3、B.,3(w)p,.i=0 j=0u, W G 0,1S (u,明=B 0,3(u) Bu) B 2,3(u) B 重(u)p 00p 01p 02p 03-B 0,3( w) _10111213B1,3(巧)p 20 p 21 p 22p 23B 2 3( w)2,3-p 30 p 31 p 32 p 33-_ B 3,3( w) _(式 2-6)(式 2-7)其矩阵表示为S(,仞=UMZBZMW-13 - 3 13 - 6 3 0U = u 3U 2U1,W = W3 W2W1, M =z - 3 30 0(式 2-8)100 01.2贝齐尔曲面性质1. Bezier曲面特征网格的四个角点
4、正好是Bezier曲面的四个角点,即P(0,0)=P00P(1,0)=PM0P(0,1)=P0NP(1,1)=PMN2. Bezier曲面特征网格最外一圈顶点定义Bezier曲面的四条边界;Bezier曲面边界的跨界切矢只能 与定义该边界的顶点及相邻一排顶点有关,且P00P10P01,P0nP1nP0,n-1,Pm0Pm-1,0Pm1,分别是四个角点的切平面;跨界二阶导矢只与定义该边界的及相邻两排顶点有关。几何不变性、凸 包性、对称性等性质可由Bezier曲线的相关性质容易推广得到。图2-1阴影三角形1.3贝齐尔曲面算法Bezier曲线的递推(de Casteljau)算法,可以推广到Bezi
5、er曲面的情形。若给定Bezier曲面特征网格的 控制顶点:PiJ(i = 0,1,m,j = 0,1,n)和一对参数值(u,v),则:P (u, V) = m- n l PklB(u) B . (v) = . = Pm.nU, V G 0,1i=0 j=0式(一条曲线可以表示成两条低一次曲线的组合,一张曲面可以表示成低一次的四张曲面的线性组合。Pk ,l = v i,j其中:Pij(1 - U ) P k-1,0 + UP k-1,0iji+1, j(1 V) Pm ,l-1 + vPm,l-10, j0, j+1(k = l = 0)(k = 1,2,., m; l = 0)(k = m,
6、 l = 1,2,., n)式(2-10)或.PHPk,l = (1 一 v)P0,l-1 + VP0,l-1ijiji, j+1(1 U ) Pk -1,n + uPk-1,nIi 0i+1,0(k = l = 0)(k = 0; l = 1,2,., n)(k = 1,2,,m; l = n)式(2-11)上面给出了确定曲面上一点的两种方案。当按(1)式方案执行时,先以u参数值对控制网格u向的n+1 个多边形执行曲线de Casteljau算法,m级递推后,得到沿v向由n+1个顶点,0j )构成的中间多边形。再以v参数值对它执行曲线的de Casteljau算法,n级递推以后,得到一个P券
7、,即所求曲面上的点。 也可以按(2)式方案执行,先以v参数值对控制网格沿v向的m+1个多边形执行n级递推,得沿u 向由m+1个顶点 =,m)构成的中间多边形。再以u参数值对它执行n级递推,得所求点P mn 00 。1.4程序设计步骤1.4.1 Bezier曲面的生成Bezier曲面是基于Beizer曲线而定义的,有特征网格决定其大致形状,而特征网格是由控制点确定 的。因而,绘制Bezier曲面的步骤与绘制Bezie曲面的步骤是一致的:第一,定义控制点序列;第二,定义一个二维评价器;第三,激活二维评价器;最后,创建网格。定义一个二维评价器的函数为:glMap2d()或glMap2f()函数,gl
8、Map2d()函数的原型为:Void glMap2d(GLenum target, GLdouble u1, GLdouble u2, Glint ustride,Glint uorder, GLdouble v1, GLdouble v2, Glint vorder, Glint uorder, const GLdouble * points);其中,target参数表示评价器最后生成的坐标类别,它可以取表2-1中的一个常量:常量含义GL_MAP2_VERTEX_3用(x,y,z)描述一个控制点GL_MAP2_VERTEX_4用(x,y,z,w)描述一个控制点GL_MAP2_INDEX控制点
9、代表一个颜色素引值GL_MAP2_COLOR_4控制点是RGBA颜色值GL_MAP2_NORMAL控制点是一个法线向量GL_MAP2_TEXTURE_COORD_1控制点是一个纹理坐标的s分量GL_MAP2_TEXTURE_COORD_2控制点是一个(s,t)纹理坐标GL_MAP2_TEXTURE_COORD_3控制点是一个(s,t,r)纹理坐标GL_MAP2_TEXTURE_COORD_4控制点是一个(s,t,r,q)纹理坐标表2-11.4.2绘制网格曲面(1)添加一个菜单添加一个名为Surface的菜单,在其属性对话框里的Caption栏中键入Surface0为其增加一个菜单项, 其名为
10、Bezier,在其属性对话框的 Caption 栏中键入 8。21。勾选 Pop-up 属性。按表 2-2 完成。CaptionID&MeahIDM_BZRSUFAC_MESH&FillIDM_BZRSUFAC_FILL&TextureIDM_BZRSUFAC_TEXTURE表2-2(2)添加保护成员函数添加一个保护成员函数:BzeSufacMesh(),编辑如下:Int I,j;GLfloat points443=-0.8f,-0.6f,0.8f,-0.2f,-0.6f,1.6f,0.2f,-0.6f,-0.4f,0.6f,-0.6f,0.8f,-0.6f,-0.2f,0.8f,-0.2f,
11、-0.2f,1.6f,0.2f,-0.2f,-0.4f,0.6f,-0.2f,0.8f,-0.6f,0.2f,0.8f,-0.2f,0.2f,0.4f,0.2f,0.2f,0.0f,0.3f,0.2f,-0.4f,-0.6f,0.6f,0.8f,-0.2f,0.6f,0.4f,-0.8f,0.6f,0.0f,0.8f,0.6f,-0.4f;/控制点glMap2f(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,(float*)controlPoints);/ 二维评价器glEnable(GL_MAP2_VERTEX_3);glColor3f(0,0,1);激活glPushM
12、atrix();glRotated(45,1,1,1);for (j=0;j8;j+)glBegin(GL_LINE_STRIP);for (i=0;i30;i+)glEvalCoord2f(float)i/30,(float)j/8);glEnd();glBegin(GL_LINE_STRIP);for (i=0;i30;i+)glEvalCoord2f(float)j/8,(float)i/30);glEnd();glPopMatrix();绘制glDisable(GL_MAP2_VERTEX_3);/挂起该函数将绘制一个网格曲面,因为glBegin()函数的参数为GL_LINE_STRI
13、Po编辑DrawScenc()函数在语句switch(m_typeControl).中添加语句:Case BezierSrufaceMesh:BzrSufacMesh(); break;(4)运行程序,得到如图2-2的结果图2-2 Bezier网格曲面1.4.3绘制一个填充曲面(1)增加两个保护函数Lighting()和 BzrSufacFill()函数,Lighting()函数光照处理,BzrSufacFill()函数则绘制曲面。Lighting();glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);/光照glMap2f(GL_MAP2_VERT
14、EX_3,0,1,3,4,0,1,12,4,(float*)controlPoints); 二维评价器glMapGrid2f(30,0,1,30,0,1); / 自动网格glEnable(GL_MAP2_VERTEX_3); 激活glPushMatrix();glRotated(45,1,1,1);glEvalMesh2(GL_FILL,0,30,0,30);glPopMatrix();绘制glDisable(GL_MAP2_VERTEX_3);glDisable(GL_AUTO_NORMAL);glDisable(GL_NORMALIZE);glDisable(GL_LIGHTING);/挂
15、起编辑 DrawScene()函数在语句switch(m_typeControl).中添加语句;Case BezierSurfaceFill:BzeSufacFill(); break;运行程序,得到如图2-3的结果这是Bezier曲面的一个特性。说明:程序输出的是斜二测投影图,X轴正方向向右,Y轴正方向向下,X、Y、Z三个轴正方成右手坐标系.曲面显示在Z 轴负坐标的位置上。图2-4中所示为轮船船艏,首柱线与设计水线交于曲面的右上角;最大横剖线 与设计水线交于曲面左上角:曲面右下角为首柱线与龙骨线的切点或交点:曲面左下角为最大横剖 线与底部龙骨起跑线的交点。#include StdAfx.h#
16、include OpenGL.h/添加头文件名 /#include #include bitmap.h #define PI (double)3.1415926) #define RADIANS(fAngle) (double)(fAngle)*PI/180.0) COpenGL:COpenGL(void):type(MESH)/类型网格/GLfloat points443=/ GLfloat points4*4*3= /-0.8f,-0.6f,0.8f,-0.2f,-0.6f,1.6f,0.2f,-0.6f,-0.4f,0.6f,-0.6f,0.8f, /-0.6f,-0.2f,0.8f,-
17、0.2f,-0.2f,1.6f,0.2f,-0.2f,-0.4f,0.6f,-0.2f,0.8f, / -0.6f,0.2f,0.8f,-0.2f,0.2f,0.4f,0.2f,0.2f,0.0f,0.3f,0.2f,-0.4f, / -0.6f,0.6f,0.8f,-0.2f,0.6f,0.4f,-0.8f,0.6f,0.0f,0.8f,0.6f,-0.4f /;/输入各点坐标/ for(int i=0;i4;i+) / for (int j=0;j4;j+) /for (int m=0;m3;m+)/controlPointsijm=pointsi*4*3+j*3+m; TOC o 1-5
18、 h z /COpenGL:COpenGL(void)/添加函数类型为 void/ wglMakeCurrent(hDC, NULL); wglDeleteContext(hRC); void COpenGL:Init(void) glClearColor(1.0,1.0,1.0,1.0);glClearDepth(1.0);glEnable(GL_DEPTH_TEST);glShadeModel(GL_SMOOTH);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); bool COpenGL:S
19、etupPixelFormat(HDC hDC0) int nPixelFormat;hDC=hDC0;PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 ; if (!(nPixelFormat = ChoosePi
20、xelFormat(hDC, &pfd) MessageBox(NULL,can not find proper mode,Error,MB_OK|MB_ICONEXCLAMATION); /若错误则显示 can not find proper modeerror/return FALSE;/返回 FLASH/ SetPixelFormat(hDC,nPixelFormat,&pfd); hRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hRC); return TRUE;/返回 TURE/ void COpenGL:Reshape(int wi
21、dth,int height) / glViewport(0,0,width,height); / glMatrixMode(GL_PROJECTION); / glLoadIdentity(); / gluPerspective(60,(GLfloat)width/(GLfloat)height,0.1,3000.0);/ glMatrixMode(GL_MODELVIEW);glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60,(GLfloat)width/(G
22、Lfloat)height,0.1,3000.0);glMatrixMode(GL_MODELVIEW);/glMatrixMode(GL_MODELVIEW);enum AspectFRONT,BACK,LEFT,RIGHT,UP,DOWN;enum ColorBLUE,GREEN,RED,ORANGE,WHITE,YELLOW;/代表颜色索引值/const GLubyte colorTable63=0,0,255,0,255,0,255,0,0,255,102,0,255,255,255,255,255,0;void COpenGL:Render()glClear(GL_COLOR_BUF
23、FER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();gluLookAt(0,0,3,0,0,0,0,1,0);switch(type)case MESH:DrawMesh();/绘制网格/ break;case FILL:DrawFill();break;/绘制填充曲面/绘制填充曲面/DrawTexture();break;/绘制贴图曲面/case TEXTURE:/GLint vertices83=-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,1default:break;/draw
24、 stuff/ draw cube;/in order:front ,back ,left ,right,top,bottomGLubyte vertIndex64=6,2,3,7,5,1,0,4,4,0,2,6,7.3.1.5, 2,0,1,3;/ for (int i=0;i6;i+)(/glColor3ubv(colorTablei);/glBegin(GL_QUADS);/for (int j=0;j4;j+)/glVertex3iv(verticesvertIndexij);/glEnd();/glFlush();SwapBuffers(hDC);void COpenGL:DrawM
25、esh()GLfloat controlPoints443=-0.8f,-0.6f,0.8f,-0.2f,-0.6f,1.6f,0.2f,-0.6f,-0.4f,0.6f,-0.6f,0.8f,-0.6f,-0.2f,0.8f,-0.2f,-0.2f,1.6f,0.2f,-0.2f,-0.4f,0.6f,-0.2f,0.8f,-0.6f,0.2f,0.8f,-0.2f,0.2f,0.4f,0.2f,0.2f,0.0f,0.3f,0.2f,-0.4f,-0.6f,0.6f,0.8f,-0.2f,0.6f,0.4f,-0.8f,0.6f,0.0f,0.8f,0.6f,-0.4f;/定义控制点/in
26、t i,j;glMap2f(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,(float*)controlPoints);/二维评价器/glEnable(GL_MAP2_VERTEX_3);glColor3f(0,0,1);/激活/glPushMatrix();glRotated(45,1,1,1);for (j=0;j8;j+)glBegin(GL_LINE_STRIP);for (i=0;i30;i+)glEvalCoord2f(float)i/30,(float)j/8);glEnd();glBegin(GL_LINE_STRIP);for (i=0;isizeX,t
27、extureImage-sizeY0,GL_BGR_EXT, GL_UNSIGNED_BYTE,textureImage-data); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE
28、R,GL_NEAREST);glTexEnvf(GL_TEXTURE_ENVGL_TEXTURE_ENV_MODE,GL_DECAL); / 构造纹 理/ glMap2f(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,(float*)controlPoints);glMap2f(GL_MAP2_TEXTURE_COORD_2,0,1,2,2,0,1,4,2,(float*)controlPoints);/二维评价器:生成几何坐标和纹理坐标/Lighting();glEnable(GL_TEXTURE_2D);glEnable(GL_MAP2_TEXTURE_COORD_2
29、);glEnable(GL_MAP2_VERTEX_3);glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);/光照/glMapGrid2f(30,0,1,30,0,1);glPushMatrix();glScaled(1.2,1.2,1.2);glRotated(45,0,0,1);glRotated(45,1,1,1);glEvalMesh2(GL_FILL,0,30,0,30);glPopMatrix();/绘制 /glDisable(GL_MAP2_VERTEX_3);glDisable(GL_MAP2_TEXTURE_COORD_2);gl
30、Disable(GL_TEXTURE_2D);glDisable(GL_AUTO_NORMAL);glDisable(GL_NORMALIZE);glDisable(GL_LIGHTING);/挂起/else(MessageBox(NULL,failed to load image, ,MB_OK);void COpenGL:Lighting()/编辑光照函数/GLfloat lightAmb=0.2,0.2,0.2,1;GLfloat lightPos=1,1,2,1;GLfloat matDiffuse=0,0.7,0.7,1;GLfloat matSpecular=1,1,1,1;GLfloat matShininess=60;glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glLightfv(GL_LIGHT0,GL_AMBIENT,lightAmb);glLightfv(GL_LIGHT0,GL_POSITION,lightPos);glMat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业自动化控制系统升级改造手册
- 人工智能算法工程师算法优化KPI考核表
- 分布式光伏系统操作指南
- 零售店店长商品销售及库存管理KPI考核表
- 关于2026年二季度客户服务计划函7篇范本
- 项目进度管理与监测指南
- 法庭科学分析师工作考核表
- 关于大学生思想动态及安全的舆情报告4月(2篇)
- (2026年)护理业务工作总结报告
- 关于2026年财务报表延迟确认回复函(3篇)
- 2026版公路水运工程试验检测专业技术人员职业资格考试《桥隧工程一本通》
- 第一单元大单元教学殖民地人民的反抗与资本主义制度的扩展教学设计 2023-2024学年部编版九年级历史下册
- 青少年阅读挑战赛活动计划
- 客车维修理论题库单选题100道及答案
- 大自然的声音(第二课时)课件度小学语文三年级上册
- 人教版英语七年级上册阅读理解专项训练16篇(含答案)
- 教科版小学三年级科学知识竞赛题五篇材料
- 手术室人员管理
- 数字贸易学 课件 第22章 数字贸易规则构建与WTO新一轮电子商务谈判
- 显微硬度的测定课件
- 《针灸治疗》课件-第十六节 网球肘
评论
0/150
提交评论