1、曲线和曲面造型第三专题曲面造型的发展趋势曲面造型的发展趋势 曲线的参数方程 )()()(tzztyytxx 给定一个t值,就得到曲线上一点的坐标。当t在参数域a,b内连续变化时,就得到了曲线。为了方便起见,可以将a,b区间规范化成0,1。kjip)()()()(tztytxt曲线参数表示矢量方程式)()()()(tztytxt,pp 给定一个t值,就得到曲线上一点的坐标。当t在参数域a,b内连续变化时,就得到了曲线。为了方便起见,可以将a,b区间规范化成0,1。螺旋线的参数方程可以写为螺旋线的参数方程可以写为 bzayaxsincos),(vbt 螺旋线的重要性质:螺旋线的重要性质:,:00
2、,:00 bbbz 上升的高度与转过的角度成正比即上升的高度与转过的角度成正比即上升的高度上升的高度 bh2螺距螺距,2 tax cos tay sin vtz 或曲线参数方程实例曲线参数方程实例),(),(),(vuzzvuyyvuxx双参数描述表达式 曲面的范围通常用两个参数u和v的变化区间的矩形区域2121,vvvuuu给出。这种曲面通常叫做矩形域曲面。参数u和v的变化区间一般规范为0,1,),(),(),(),vuzvuyvuxvu s(s),(zyx矢量方程式为 当参数u,v在参数域0,1中连续变化时,其对应点就形成一张曲面。向线称为曲面的参数曲线(等参数线)。u,v 分别等于0,1
3、时的参数曲线。),(),(),()0000vuzvuyvuxvu s(sv),(),(),(),(0000vuzvuyvuxvu ssuv)1,(),0,(),1(),0(ususvsvs)1,1(),0,1(),1,0(),0,0(ssss当u=u0时,表示曲面上一条沿V方向的空间曲线,称为向线,向线和曲面的边界曲线曲面的四个角点u向线。当v=v0时,类似地,可以定义nkduudpduudpuukkuukk,1,0)()(00|0)()(iiupup)(iiiupupup )()(2niniiuuBDuP0,10)()(其中)(,uBni被称为Bernstein基函数。niinuuinini
4、nuuCuBiiinni,1,0)1()!(!)1()(,)1(*)1(lk),1,0;,1,0(,ljkiDjilk*lk*kiljjlikjivuvBuBDvuS00,1,0,)()(),(。)(,uBikikuuCuBiikik)1()(,)(,vBjljljjljluuCvB)1()(,为u向Bernstein基函数,为v向Bernstein基函数,),1,0(niDinikiiuufDuB0,10),()()(,ufki110kiuuu),1,0(niDi称为B样条基函数,是由节点矢量U:所决定的k次分段多项式。顺序连接控制顶点所形成的多边形成为控制多边形。移动定点对B样条曲线的影响
5、 k次B样条曲线与k+1个顶点有关)()(,vfufljki与),1,0;,1,0(njmiDij)1()1(nm),1,0;,1,0(njmiDij110,kmuuuU110,lnvvvVnimjnlmkljkiijuuvuuuvfufDvuS0011,)()(),(,njkjjkiikinikiiuBuBuRuRduP0,0,)()()()()()(,uRki)(,uRki式中称为k次有理基函数,具有和k次B样条基函数相同的性质 nikiinikiiiuBuBduP0,0,)()()(nii,1,0,nidi,1,0,0,0,0in其余)(,uBki,110knuuuU式中:分别与首、末权
6、因子。为由节点矢量节点矢量中的节点数为m=n+k+1,n为控制点数,k为B样条基函数的次数。决定的k次B样条基函数。控制顶点相联系。权因子nimjljkijinimjljkijijivBuBvBuBdvuP00,00,)()()()(),(jid,ji,)(,uBki)(,vBlj式中:控制顶点网权因子:v向节点矢量:沿v向的l次B样条基函数:沿u向的k次B样条基函数:u向节点矢量uvNurbsNurbs曲线数据结构图曲线数据结构图 NurbsNurbs曲面数据结构图曲面数据结构图 classCurve public:intCurveNo;*曲线号*intk;*曲线次数*ControlPoin
7、tCP;*控制点指针*KnotVectorKV;*节点矢量指针*classControlPointpublic:intVertexNo;*控制点序号*doubleVertex3;*控制点坐标*doubleWeight;*控制点权因子*public:voidFormatControl(CStringstr);classKnotVectorpublic:intKnotNo;*节点序号*intMultiplicity;*节点重复度*doubleKnotValue;*节点值*public:voidFormatKnot(CStringstr);VCVC写的写的NURBSNURBS曲线数据结构曲线数据结构
8、classSurfaceControlPoint*Up;ControlPoint*Vp;KnotVector*KU;KnotVector*KV;VCVC写的写的NURBSNURBS曲面的数据结构曲面的数据结构控制点、节点的可视化实现控制点、节点的可视化实现 为实现对控制点、节点链表实时进行插入、删除和修改等操作,可将这些操作同对话框联系起来。并通过操作对话框上的控件,实现对控制点、节点链表实时插入、删除和修改等操作过程的可视化。利用VC实现控制点链表的插入、删除和修改等操作过程的可视化的过程如下:(2)建立与对话框相联系的类CmodifierVertex,同时编写与按钮相关的成员函数OnAdd
9、()、OnInsert()、OnUpdate()、OnRemoveAt()和OnRemoveAll();(1)建立如图1所示的对话框,对话框中有按钮Add、Insert、Update、RemoveAt、RemoveAll,可对控制点链进行操作;有组合框可显示控制点链表中的数据;(3)将控制点链表中的数据在组合框中显示出来。voidCModifierVertext:OnAdd()TODO:Addyourcontrolnotificationhandlercodehereif(UpdateData()!TRUE)return;ControlPoint*pControlnewControlPoint
10、;pControlVertexNom_VertexNo;pControlVertex0m_Vertexx;pControlVertex1m_Vertexy;pControlVertex2m_Vertexz;pControlWeightm_Weight;ControlPoint_ListAddTail(pControl);AddToListBox(pControl);*将数据添加到组合框*添加操作的程序设计实例 PIXELFORMATDESCRIPTOR pixelDesc;/像素存储格式化,对结构变量进行了填充;pixelDesc.nSize=sizeof(PIXELFORMATDESCRIP
11、TOR);/pfd的大小pixelDesc.nVersion=1;/版本号pixelDesc.dwFlags=PFD_DRAW_TO_WINDOW|/支持窗口PFD_SUPPORT_OPENGL|/支持OpenGLPFD_DOUBLEBUFFER;/支持双缓存pixelDesc.iPixelType=PFD_TYPE_RGBA;/RGBA类型pixelDesc.cColorBits=32;/32位色深度pixelDesc.cRedBits=8;/各颜色位pixelDesc.cRedShift=16;pixelDesc.cGreenBits=8;pixelDesc.cGreenShift=8;p
12、ixelDesc.cBlueBits=8;pixelDesc.cBlueShift=0;pixelDesc.cAlphaBits=0;/无alpha缓存pixelDesc.cAlphaShift=0;/忽略转换位pixelDesc.cAccumBits=64;/各累计位pixelDesc.cAccumRedBits=16;pixelDesc.cAccumGreenBits=16;pixelDesc.cAccumBlueBits=16;pixelDesc.cAccumAlphaBits=0;pixelDesc.cDepthBits=32;/32位深度缓存pixelDesc.cStencilBit
13、s=0;/无模版缓存pixelDesc.cAuxBuffers=0;/无辅助缓存pixelDesc.iLayerType=PFD_MAIN_PLANE;/主层pixelDesc.bReserved=0;/保留pixelDesc.dwLayerMask=0;pixelDesc.dwVisibleMask=0;pixelDesc.dwDamageMask=0;/设置一个线程的当前绘图描述表wglMakeCurrent(hDC,m_hGLContext);/对自由曲线曲面的绘制DoNURBS();/释放绘图描述表wglMakeCurrent(hDC,NULL);/释放RC(一般在WM_DESTORY
14、消息响应函数OnDestory()中进行)wglDeleteContext(m_hGLContext);至此,一个基于OpenGL的基本程序框架构造完毕,具体对自由型曲线曲面的构造工作在DoNURBS()中完成。在绘制自由曲线曲面之前用wglCreateContext()创建一个渲染上下文RC并将其作为参数,通过wglMakeCurrent()来建立一个当前的绘图描述表,并在绘制完毕后将其释放。/节点序列GLfloat Notes8=0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f;/定义控制点for(int i=0;i4;i+)for(int j=0;j4;j+
15、)LinchpinPtij0=(GLfloat)(3.0f*(i-0.5f);LinchpinPtij1=(GLfloat)(3.0f*(j-0.5f);if(0i&i3&0j&j3)LinchpinPtij2=4.0f;elseLinchpinPtij2=-4.0f;/创建NURBS曲面对象Nurb=gluNewNurbsRenderer();/设置NURBS曲面对象属性gluNurbsProperty(Nurb,GLU_SAMPLING_TOLERANCE,30.0f);gluNurbsProperty(Nurb,GLU_DISPLAY_MODE,GLU_FILL);/开始NURB区间绘制
16、gluBeginSurface(Nurb);/定义NURBS曲面的形状gluNurbsSurface(Nurb,8,Notes,8,Notes,4*3,3,&LinchpinPt000,4,4,GL_MAP2_VERTEX_3);/结束曲面绘制gluEndSurface(Nurb);glPopMatrix();/强制绘图,不驻留缓存glFlush();void gluNurbsSurface(GLUnurbsObj*nobj,/NURBS曲面对象GLint sknot_count,/u方向节点数目GLfloat*sknot,/u方向节点数组指针GLint tknot_count,/v方向节点数
17、目GLfloat*tknot,/v方向节点数组指针GLint s_stride,/u方向控制点数据跨度GLint t_stride,/v方向控制点数据跨度GLfloat*ctlarray,/控制点数组指针GLint sorder,/u方向上多项式阶数GLint torder,/v方向上多项式阶数GLenum type/确定求值器类型);另有gluNurbsCurve()函数也可用于NURBS曲线曲面的定义,使用方法与之类似。GLfloat Light_position=1.0f,1.0f,1.0f,0.0f,;GLfloat Light_diffuse=1.0f,1.0f,0.0f,1.0f,
18、;glLightfv(GL_LIGHT0,GL_POSITION,Light_position);/定义光源位置glLightfv(GL_LIGHT0,GL_DIFFUSE,Light_diffuse);/定义光源漫射光glEnable(GL_AUTO_NORMAL);/自动生成曲面法向量glEnable(GL_LIGHTING);/启动光照模型;glEnable(GL_LIGHT0);/使光源GL_LIGHT0有效 OpenGL中所指的材质均指构成三维实体的材料在光照模型中对于R、G、B三原色的反射率。与光源的定义类似,材质的定义分环境、漫射、镜面反射等成分,另外还有镜面高光指数、辐射成分等
19、等:/设置材质的反射成分GLfloat mat_ambient=0.8f,0.8f,0.8f,1.0f;GLfloat mat_diffuse=0.8f,0.0f,0.0f,1.0f;/紫色GLfloat mat_specular=1.0f,0.0f,1.0f,1.0f;/镜面高光亮紫色 GLfloat mat_shininess=100.0f;/高光指数glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);/定义环境光反射率glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);/定义漫射光反射率glMaterialf
20、v(GL_FRONT,GL_SPECULAR,mat_specular);/定义镜面光反射率glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);/定义高光指数 OpenGL中材质的颜色与光照模型中光源的颜色含义是不同的。对于在光源中的定义,R、G、B分别表示三原色在光源中所占的比率;而对于材质的定义,R、G、B则表示具有这种材质属性的物体对于三原色的反射率,场景中物体所呈现的颜色是光照模型、材质定义共同作用的结果。产品创意设计产品创意设计制作油泥模型制作油泥模型三维扫描三维扫描三维点云三维点云反求反求三维模型三维模型CADCAD制作制作输入点云数据点云過濾器