1、前 言,上讲内容回顾 三维建模方法 三维观察与剪裁 三维几何变换(平移、旋转、缩放、错切、复合变换) 三维观察变换(指定观察坐标系、投影变换、定义观察体) OpenGL中的观察转换 定义视点gluLookAt() 定义视景体glFrustum()、 gluPerspective()、 glOrtho() 定义视口glViewport() 切割视景体,(3)参数曲线曲面,Introduction of Computer Graphics,第三章 模型及变换,Introduction of Computer Graphics,Introduction of Computer Graphics,肖双
2、九 上海交通大学数字艺术实验室,本讲内容,曲线的表示及绘制 参数曲线基础知识 常用参数曲线 OpenGL中曲线的绘制 曲面的表示及绘制 常用参数曲面 OpenGL中曲线曲面的绘制,前言,对于具体的应用,使用一个紧凑的曲线曲面表示的优点: 它们有比多边形集合更加紧凑的表达式,对于模型的保存,可以节省存储空间。 使用少量的控制多边形就能得到比直线和平面多边形更加光滑更加连续的图形。 对于一个函数曲面的变换比对多边形网格表示的曲面的变换的复杂度更小。,前言,对于具体的应用,使用一个紧凑的曲线曲面表示的优点: 可以很容易生成模型的LOD结构。因而在实时绘制时根据实际情况提高绘制质量或者提高帧速率。
3、动画中,曲面只有少量的点需要进行变换。这些变换后的点再形成一张新的光滑曲面。 对于碰撞检测,更加有效更加精确。 可以使实时计算机图形应用更快速,编码更快速,生存期更长。,一、曲线的表示和绘制,1.1 曲线曲面参数化表示基础,1.1.1 显示、隐式和参数表示显式表示 平面曲线显式方程的一般形式为 因为一个y值只能对应一个x值,因此显式方程不能表示封闭或多值的曲线,例如,x,y,x,y,隐式表示 平面曲线隐式方程的一般形式为例如一个圆锥曲线的二阶隐式方程可写成,双曲线,非参数表示的问题与坐标轴相关 会出现斜率为无穷大的情况(如垂线) 非平面的曲线,系数不是常量 不便于计算和编程,参数表示 平面曲线
4、参数方程的一般形式为通常将参数规格化到0,1之间,只研究这一个区间中的参数曲线,参数表示,例如,直线的两端点分别为p1 (1,2)和p2 (4,3) 其参数方程为当 p=p1时,t=0p=p2时,t=1写成分量参数方程形式为,x,y,参数表示,一个以坐标原点为圆心半径为r的圆 其参数方程可表示为参数u是一个规格化了的角度参数当圆上某一点与原点的连线与x轴正向的夹角从0变化到2,就绘制出了整个圆,因此u= /2 当=0,参数 u=0;= 2,参数 u=1;= /2 ,参数 u=1/4; = ,参数 u=1/2;,x,y,参数表示的优点(1) 有更大的自由度来控制曲线、曲面形状例如,一个二维三次曲
5、线的显式方程为有4个系数可以用来控制曲线形状,而其参数表达式为有8个系数可以用来控制曲线形状,参数表示的优点(2) 易于用矢量和矩阵表示几何分量,简化计算 非参数方程的几何变换要通过对所有型值点进行变换来实现,而参数方程可以直接进行变换;,三次Hermite参数曲线,参数表示的优点(3) 便于处理斜率为无穷大的问题,不会出现计算中断;平面直线显式方程非参数方程无法表示 x = c(常数)的直线,因为此时dx=0,斜率k为无穷大;而用参数方程就可以直接表示。,x,y,b,dy,(x,y),dx,参数表示的优点(4) 参数方程对变量个数不限,从而可以很方便地把低维曲线曲面扩展到高维空间中去;例如一
6、条二维三次参数曲线,扩展到三维的参数表达式为,扩展到三维空间,就可以做三维的变换或其他计算,参数表示的优点(5) 0,1之间规格化的参数,使其相应的几何分量是有界的,不需要另外的参数定义其边界。例如前例中直线段的参数方程自然表示出端点为 (1,2)和(3,4),如果是显式方程,还要专门说明两端点的位置,否则直线方程 表示的是一条无限的直线而不是线段。,1.2 参数曲线的定义及相关基本概念 三维参数曲线的一般表达式基本概念 位置矢量曲线上任意一点的位置矢量p(t),x,y,z,t=0,t=1,切矢量T,曲线上两点r和Q的参数分别为t和 t+tr和Q两点之间的弦长当r和Q之间的弧长c0时,pc,曲
7、线在该点处的单位切矢量切矢量dp/dt 仅与T成比例 若切矢量数值远远超过曲线弦长的几 倍,曲线会出现回转现象,x,y,z,t=0,t=1,c,p,基本概念,曲率k表示曲线在该点处的弯曲程度当Q趋向于r,即c0时,,x,y,z,c=0,c=1,c,可以看作在该点处,有一个半径为的密切圆内切于该点,曲率半径就为 ,曲率为1/k,密切圆的圆心称为“曲率中心”,主法矢N和副法矢B垂直于切矢量T的矢量都是法矢量,构成法平面其中指向曲率中心的单位法矢量称为单位主法矢N单位副法矢BTNT和N构成密切平面N和B构成法平面B和T构成化直平面,基本概念,x,y,z,c=0,c=1,法平面,密切平面,化直平面,基
8、本概念,扰率表示曲线在该点处的扭出其密切平面的速率当Q趋向于r,即c0时,,基本术语,样条 Spline,A traditional spline used for drawing smooth curves. The wooden spline is bent into shape using spline weights.,基本术语,插值 插值的概念给定函数 f(x)在区间a,b上n个不同的值f(xi) , i=1,2,3,n,寻找某一函数(x)逼近f(x),(xi)=f(xi)(x)就称为插值函数,也称插值样条曲线, xi为插值节点;,线性插值 给定两点x1和x2处的值用一个线性函数进行
9、插值代入(x)的表达式,可求出系数a和b,插值,y1,y2,插值,二次插值 需要知道函数f(x)上的三个点x1、x2 和x3的值y1、y2 和y3用一个二次函数来插值必须满足方程组求解出系数a、b、c,就可以构造出二次插值函数(x),逼近,当型值点太多时,很难构造插值函数 选择一个次数较低的函数F(x),最佳逼近这些型值点 最小二乘逼近 构造F(x)使达到极小也称F(x)为逼近样条,光顺,平面曲线的光顺条件: (1) 具有二阶几何连续G2 (2) 不存在多余的拐点 (3) 曲率变化比较小 曲线段之间的连续性 参数连续性C和几何连续性G 在结合点P处位置重合,称为C0和G0连续 在点P处切矢量方
10、向相同,大小相等C1连续;在点P处切矢量方向相同,大小不等G1连续; 在点P处的n阶导矢方向相同,大小相等C n连续;在点P处的n阶导矢方向相同,大小不等Gn连续;,1.3 常用参数曲线1.3.1 样条曲线 样条曲线的表示有三种等价的方式:(1) 列出一组在样条边界上的边界条件;(2) 列出描述样条特征的矩阵;(3) 列出一组调合函数(或基函数)。 Hermit三次样条曲线 三次参数曲线方程的一般矢量形式是,Hermit三次样条曲线 设有n+1个形值点 两相邻型值点Pk和Pk+1之间Hermit曲线的边界条件是:边界条件的矩阵表示为,Hermit三次样条曲线 系数矩阵求解得到,Hermit矩阵
11、,矩阵相乘,得到调和函数表达式为,4个调合函数,1.3.2 Bzier曲线法国雷诺汽车公司的P.E.Bzier提出的一种以逼近为基础的参数曲线Bzier曲线的定义,1.3.2 Bzier曲线 n次Bzier曲线上各点的插值公式为,例如,三次Bzier曲线(n=3)的调和函数为,则,三次Bzier曲线方程为,1.3.2 Bzier曲线 Bzier曲线的调和函数,0,1,t,B0,3,B1,3,B2,3,B3,3,1.3.2 Bzier曲线Bzier曲线的调和函数的性质 正性权性递推性,1.3.2 Bzier曲线Bzier曲线的性质 曲线的起点与终点与控制多边形的起点和终点重合; 曲线的两端点处的
12、切矢量方向与控制多边形的第一条和最后一条边重合; 对称性。将控制顶点的顺序反向,得到的曲线形状不变,方向相反; 凸包性。曲线总落在控制多边形的凸包中; 变差缩减性。曲线的波动比控制多边形小。,1.3.2 Bzier曲线Bzier曲线的绘制算法分割递推Casteljau算法(这里以三次曲线为例)计算曲线上对应参数t 的点的位置C(t),C(t),P30,C(t),P30,1.3.2 Bzier曲线推广到n次的Bzier曲线Casteljau递推公式为Bzier曲线的设计技术 三个控制顶点,生成抛物线,四个控制顶点生成三次曲线,以此类推; 退化形式共线的控制顶点生成直线段的Bzier曲线;一组重合
13、的控制点生成一个点的Bzier曲线;,1.3.2 Bzier曲线Bzier曲线的设计技术 将第一个和最后一个控制顶点重合,可得到封闭的Bzier曲线; 多个控制点在某位置重合,Bzier曲线会更靠近该位置; 使用任何数目的控制点拟合Bzier曲线,复杂曲线可以用几个低次的Bzier曲线段拼接,P5,1.3.2 Bzier曲线Bzier曲线的设计技术 Bzier曲线段拼接的连续性问题0阶连续性:只要两控制多边形端点连续, 相邻Bzier曲线段之间自然达到C0和G0连续;1阶连续性:回顾连续性的定义充要条件:Pn-1、Pn=Q0、Q1三点共线,可达到G1连续;若使得T1=T2,达到C1连续;,1.
14、3.2 Bzier曲线Bzier曲线的设计技术 Bzier曲线段拼接的连续性问题2阶连续性:在1阶连续的前提下,满足两个附加条件:拼接点处的密切平面重合;曲率相等 ,可达到C2连续;,1.3.2 Bzier曲线n次Bzier曲线的升阶 通过增加控制顶点,不改变曲线形状,实现对曲线更灵活的控制;,P0(1)=,P1(1),P2(1),P3(1),P4(1)=,1.3.2 Bzier曲线Bzier曲线的升阶 新的控制顶点是原来控制多边形在参数i/(n+1)处的线性插值; 升阶后的新控制多边形在原来的控制多边形的凸包内; 升阶后的控制多边形更靠近Bzier曲线,1.3.2 Bzier曲线有理Bzie
15、r曲线 参照有理多项式,为Bzier曲线方程加入权因子hi,1.3.2 Bzier曲线 引入权因子可更好地控制曲线的形状权因子增大 ,曲线逐渐被拉向该控制顶点,h2=1/2,h2=1,h2=2,1.3.2 Bzier曲线Bzier曲线的缺点 控制顶点的数目n决定了Bzier曲线的阶次,当n很大时,控制多边形对曲线的控制将会减弱; Bzier曲线不能做局部修改。改变某一控制顶点,整条曲线都会改变。这是因为Bzier曲线的调和函数在0 t 1的整个区间内都不为0。,1.3.3 B样条曲线已知n+1个控制顶点Pi (i=0,1,n),k次B样条曲线的表达式为,1.3.3 B样条曲线,节点矢量 Kno
16、t Vector节点为非减序排列,即ti+1 t 当节点沿参数参数轴等距分布,即ti+1- ti为常数,则为均匀B样条曲线; 若ti+1- ti不为常数,则为非均匀B样条曲线;,1.3.3 B样条曲线,均匀B样条曲线节点矢量的定义 例如,由4个控制顶点的2次B样条曲线的节点矢量为 一条均匀B样条曲线的所有调和函数Bi,k(u)形状都相同,1.3.3 B样条曲线,均匀B样条曲线,Uniform B-spline basis functions from degree 1 to 6. As degree increases, the basis functions become smoother
17、and have a larger support, but each basis function still has only local influence over a curve or surface.,1.3.3 B样条曲线,非均匀B样条曲线 节点矢量可以为0,1,2,3,3,40,2,2,3,3,60,0.2 ,0.6 ,0.9 ,1.0 增加调和函数形状的多样性,更有效地调整曲线形状,增加细微的摆动,甚至增加不连续的局部,B0,2,B1,2,B2,2,B3,2,B4,2,1.3.3 B样条曲线,Cubic B-spline basis functions for two dif
18、ferent knot vectors.,example B-spline curves defined on these bases.,1.3.3 B样条曲线,B样条曲线的优点 曲线次数独立于控制点数目; 允许局部修改曲线形状。,1.3.3 B样条曲线,B样条曲线的性质 局部性。调和函数仅在ti,ti+k+1区间内有值,使得k次B样条曲线在修改时仅与相邻的k+1个控制顶点相关连续性。 k次B样条曲线在整个参数u取值范围内具有Ck-1阶连续。如果在某一节点处是L重节点, 则具有Ck-L阶连续,1.3.3 B样条曲线,B样条曲线的性质 变差缩减性。在相邻节点之间的每个样条曲线段包含在相邻的k+1
19、个控制点所形成的凸包内,任意直线与曲线的交点数不超过与控制多边形的交点数。 造型的灵活性。可以构造直线段、尖点、切线等特殊情况。 构造直线。对三次B样条曲线,设置4个控制顶点Pi, Pi+1, Pi+2, Pi+3在同一直线上,就可以得到一段直线,此时对应的 ti+3 u ti+4曲线段即为一条直线,且与Pi Pi+1 Pi+2 Pi+3所在的直线重合,1.3.3 B样条曲线,B样条曲线的性质 造型的灵活性 构造尖点。对三次B样条曲线,设置控制顶点Pi, Pi+1, Pi+2三点重合,就可以使曲线过Pi点,形成尖点,P2,P3,1.3.3 B样条曲线,B样条曲线的性质 造型的灵活性 构造切线。
20、为使三次B样条曲线与某一直线L相切,设置控制顶点Pi, Pi+1, Pi+2位于L上,并且节点ti+3的重节点数不超过2个。,1.3.4 非均匀有理B 样条曲线,Non-Uniform Rational B-splineNURBS曲线 非均匀:节点矢量在参数轴上的分布不等距 加入控制顶点的权因子,便于更灵活地对曲线进行修改 函数形式Wi为控制顶点Pi的权因子、,1.3.4 非均匀有理B 样条NURBS曲线,NURBS曲线的优点 对标准的解析形状(圆锥曲线、二次曲线、回转面等)提供了统一的数学表示,便于工程数据库的存取和应用; 可以通过控制顶点和权因子更灵活地改变形状; 具有透视投影变换和仿射变
21、换的不变性; 非有理B样条、有理及非有理Bzier曲线、曲面都是NURBS的特例; NURBS已被国际标准化组织定义为工业产品形状表示的国际标准方法。,1.3.4 非均匀有理B 样条NURBS曲线,NURBS曲线的缺点 比一般的曲线、曲面定义方法更费存储空间和处理时间; 权因子选择不当会造成形状畸变; 对拼接、重叠形状的处理相当麻烦; 如点的映射这类算法在NURBS情况下会不太稳定。,1.3.5 等距线理论公式d为等距线的偏离量,N(t)为曲线在某一点的法矢量;折线集等距线:用满足精度的一系列折线段去逼近原曲线,然后再求该折线集的等距线集,获得曲线的等距线。,1.4 OpenGL中参数曲线的绘
22、制,1.4.1 绘制Bzier曲线 OpenGL一维求值器 OpenGL使用求值器构造曲线曲面; 用一维求值器绘制Bzier曲线P(u),步骤为 首先用glMap1()命令定义一维求值器;,Void glMap1fd(GLenum target, TYPE u1, TYPE u2, Glint stride, GLint order, const TYPE *points);,target 定义求值器所获得的控制点类型; u1, u2 确定Bzier曲线参数的取值范围; stride 表示开始控制顶点到下一个控制顶点之间的数值个数; order 表示曲线的阶数(次数1); *points 指定
23、控制顶点数据。,1.4.1 绘制Bzier曲线,glMap1()函数中控制点类型target的可选值,1.4.1 绘制Bzier曲线,glMap1()命令的调用实例,glMap1f ( GL_MAP_VERTEXT_3, 0.0, 1.0, 3 , 4, ,1.4.1 绘制Bzier曲线,用一维求值器绘制Bzier曲线P(u)步骤 调用glEnable()激活求值器; 例如: glEnable(GL_MAP_VERTEXT_3); /*激活顶点求值器*/ glEnable(GL_MAP1_TEXTURE_COORD_3); /*激活纹理坐标求值器*/ 调用glEvalCoord1()计算曲线上
24、点的坐标。 Void glEvalCoord1fdv(TYPE u); 函数功能:根据参数u的取值,计算一维求值器中指定的控制点数值。,1.4.1 绘制Bzier曲线,Bzier曲线绘制实例 要求 用8个控制顶点绘制一条7次Bzier曲线; 打开GL_MAP_VERTEXT_3 和 GL_MAP_COLOR_4 求值器,绘制曲线并生成各点的颜色值。,#include #include #include /*定义8个控制顶点坐标*/ GLfloat ctrlpoints83=-4.0,0.0,0.0,-2.0,3.0,0.0,0.0,4.0,0.0,2.0,3.0,0.0,4.0,0.0,0.0
25、,6.0,-1.0,0.0,7.0,-1.0,0.0,8.0,1.0,0.0;/*定义8个颜色控制顶点*/ GLfloat ctrlcolor84=1.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0;,void init(void) /*定义一维顶点求值器*/glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,8,void display(void) int i;glClea
26、rColor(1.0,1.0,1.0,1.0);/*清除颜色缓存和深度缓存*/glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/*设置线条宽度*/ glLineWidth(5.0);/*计算曲线上60个点的坐标,并顺序连接*/glBegin(GL_LINE_STRIP);for(i=0;i=60;i+)glEvalCoord1f(GLfloat)i/60.0);glEnd();,/*显示8个控制顶点*/glPointSize(6.0);glColor3f(0.0,0.0,1.0);glBegin(GL_POINTS);for(i=0;i8;i+
27、)glVertex3fv( /*display()*/,void reshape(int w, int h) glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)glOrtho(-10.0,10.0,-10.0* (GLfloat)h/(GLfloat)w, 10.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0);elseglOrtho(-10.0*(GLfloat)w/(GLfloat)h, 10.0*(GLfloat)w/(GLfloat
28、)h, -10.0, 10.0, -10.0, 10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity(); ,int main(int argc,char* argv) glutInit( ,1.4.2 绘制NURBS曲线,NURBS曲线绘制步骤 使用 gluNewNurbsRender()命令创建一个NURBS指针对象,用以绘制NURBS曲线和曲面; 调用gluNurbsProperty()命令控制NURBS对象的属性,如指定对象采样方式、显示模式等; 调用gluNurbsCallback()命令显示出错提示信息; 调用gluBeginCurve()
29、命令开始绘制曲线; 在gluBeginCurve()和gluEndCurve ()之间调用gluNurbsCurve ()命令创建并绘制曲线; 调用gluEndCurve ()命令结束曲线绘制;,1.4.2 绘制NURBS曲线,NURBS曲线绘制函数说明 gluNurbsProperty()命令控制NURBS对象的属性void gluNurbsProperty(GLUnurbs *nurb, GLenum property, GLfloat value);nurb是NURBS对象指针; property指定要设置的属性; value指定该属性的值。 具体的property和value的取值请看
30、参考书,1.4.2 绘制NURBS曲线,NURBS曲线绘制函数说明 gluNurbsCurve ()命令创建并绘制曲线void gluNurbsCurve (GLUnurbs *nurb, GLint knotCount,GLfloat *knot, GLint stride, GLfloat *control, GLint order, GLenum type)nurb是NURBS对象指针; knotCount指定knots中节点的数目; knots指定一个knotCount的非减节点值的数组; stride指定连续的曲线控制点之间的偏移量; control是控制顶点数组的指针; order
31、是NURBS曲线的阶数; type指定NURBS对象的类型。,1.4.2 绘制NURBS曲线,NURBS曲线绘制实例 绘制一条带法线的纹理化NURBS曲线 nobj= gluNewNurbsRender() ; gluNurbsCallback (nobj, GLU_ERROR, ErrorCallback); gluNurbsProperty(nobj,GLU_U_STEP,15.0 ); gluNurbsProperty(nobj,GLU_V_STEP,15.0 ); gluBeginCurve(nobj) ;gluNurbsCurve (nobj,GL_MAP1_TEXTURES_COO
32、RD_2); gluNurbsCurve (nobj,GL_MAP1_NORMAL);gluNurbsCurve (nobj,GL_VERTEX_4); gluEndCurve (nobj);,OpenGL曲线绘制实例BzierCurve1.exeBzierCurve2.exe,二、常用参数曲面及绘制,2.1 参数曲面的定义矩形域上的参数曲面片的一般表示,v = 0,v = 1,u = 0,u = 1,角点,边界线,pu0,pu1,p0v,p1v,Pij,曲面片上的一点p(ui,vj),记为pij,pij点的切矢:u向切矢piju与v向切矢pijv,piju,pijv,pij点的法矢:nij,
33、nij,曲面的参数连续性,如果两曲面具有公共连接线,则称它们具有C0和G0连续; 如果沿公共连接线 p()= q() 上的各点处均具有n阶的 连续偏导,则称两曲面片具有n阶参数连续性或是Cn的,即C1连续意味着必须ps()=qu()pt()=qv()C2连续意味着在C1连续的基础上还必须pss()=quu() ptt()=qvv()pst()=quv(),p(s,t),q(u,v),p(),q(),曲面的几何连续性,如果两曲面沿公共连接线p()= q()处处具有公共的切平面或公共的曲面法线,则称两曲面片具有G1连续性或是G1的,即ps、 pt、 qu、 qv四个切矢共面,p(s,t),q(u,
34、v),曲面的几何连续性,如果两曲面沿公共连接线处处具有公共的切平面并具有公共的主曲率,以及在两个主曲率不相等时具有公共的主方向,则称两曲面片具有G2连续性或是G2的,即在G1连续的基础上,还满足,2.2 常用参数曲面2.2.1 平面 平面参数方程,p(u,v),u向切矢r,v向切矢s,2.2.3 二次曲面 (Quadric Surface)三元二次方程所表示的曲面。代数形式矩阵形式,2.2.4 直纹面在曲面上任意点,绕该点的面法矢n旋转法矢平面,若法平面至少在某一方向上有一条边与曲面重叠,则称该曲面在一个方向上是直纹面,如果旋转法平面,有多个方向上法平面的边与曲面重叠,表示该曲面在该点有多个直
35、纹,直纹面可看作是两条曲面边界边的线性插值。若两条边界边是p(u,0)和p(u,1),直纹面可定义为:,2.2.5 双线性曲面 (Bilinear Surface),在单位正方形的参数空间内,将两组对边进行线性插值得到的曲面,2.2.6 Coons曲面线性Coons曲面给定四条边界曲线pu0,pu1,p0v,p1v进行u向插值,得到直纹面进行v向插值,得到直纹面根据角点进行u向和v向插值,得到直纹面,线性Coons曲面,2.2.6 Coons曲面,2.2.6 Coons曲面第二类Coons曲面不仅插值于四条边界边pu0,pu1,p0v,p1v ,还插值给定边界的斜率pu0v,pu1v,p0vu
36、,p1vu ,基本构造方法与线性Coons曲面相似。,2.2.7 张量积曲面用相同的调和函数定义边界切矢量以及构造曲面方程,此时曲面片完全由四边形域的角点信息所确定,这类型的曲面称为张量积曲面,角点位置,角点v向切矢,角点u向切矢,角点扭矢,2.2.8 Bzier 曲面定义:设pi,j(i=0,1,n; j=0,1,m)为(n+1)(m+1)个空间点列,则m n次Bzier 曲面为,控制网格,2.2.8 Bzier 曲面双线性Bzier 曲面m = n= 1,控制网格有四个控制顶点双二次Bzier 曲面m = n= 2,边界曲线和参数坐标曲线均为抛物线双三次Bzier 曲面m = n= 3,4
37、个角点; 12个边界控制点决定边界 曲线形状;4个中央控制点,p00,p03,p33,p30,2.2.8 Bzier 曲面Bzier 曲面的拼接 C0连续:边界处的控制顶点重合 C1连续: C0连续,且 Q(0,v)上的u向切矢位于P(1,v)上相应点处的切平面内; 几何上要求在公共边界上任意点处,穿过公共边界的控制点连线长度L1和L2的比值为常数, 并且公共交线两边的控制顶点P2,i,、Q0,i和Q1,i 三点共线,例如上图中 P22,、Q02和Q1,2,p00,p03,Q30,Q33,Q12,Q02,P22,2.2.9 B样条曲面设pi,j(i=0,1,n; j=0,1,m)为(n+1)(
38、m+1)个空间点列,则k l次B样条 曲面为构造步骤 沿u向构造k 次B样条曲线; 沿v向构造l 次B样条曲线,每组顶点对应u值由0到1变化,形成B样条曲面。,2.2.10 NURBS曲面,NURBS曲面的多项式表达其中Pij是特征网格上的控制顶点, Wij是相应的权因子,Bi,p(u)和Bi,q(v)是p阶和q阶的B样条的调和函数 构造方法 沿u向(或v向)构造k 次NURBS曲线; 沿v向(或u向)构造l 次NURBS曲线,每组顶点对应u值由0到1变化,形成NURBS曲面。,2.2.10 NURBS曲面,NURBS surface is designed using an interfac
39、e where the smooth surface (shown here in blue) approximates a given control mesh (in red),2.2.11 扫描面 (Sweep Surface)单截面线的回转面一段截面轮廓线P(t)=x(t), y(t), z(t) , t0,1, P(t)绕X轴旋转角生成的回转面可定义为:,2.2.11 扫描面单截面线的拉伸面一段截面轮廓线 S(t)=x(t), y(t), z(t) , t0,1拉伸路径曲线 P (u)=x(u), y(u), z(u) , u0,1,P(u),S(u),2.2.12 自由曲面造型工程
40、上通常是给出曲线或曲面上许多离散点的数据,由这些数据点构造光滑过渡的曲线或曲面,称为自由曲线和自由曲面 ( Free Form Surface )可以用逼近或插值的方式,构造自由曲线和曲面;自由曲面构造方法 分别构造U向曲线和V向曲线; 对各面片进行U向排序和V向排序; 对各曲面片进行拼接、光顺处理。,自由曲面造型实例,自由曲面造型实例,自由曲面造型实例,自由曲面造型实例,2.3 OpenGL中参数曲面的绘制,2.3.1 绘制Bzier曲面 定义OpenGL二维求值器,void glMap2fd(GLenum target, TYPE u1, TYPE u2, GLint ustride, G
41、Lint uorder, TYPE v1, TYPE v2, GLint vstride, GLint vorder, const TYPE *points);,2.3 OpenGL中参数曲面的绘制,2.3.1 绘制Bzier曲面 计算曲面上点的坐标,单点计算: void glEvalCoord2fdv (TYPE u, TYPE v); 均匀曲面坐标: void glMapGrid2fd(GLint nu, TYPE u1, TYPE u2, GLint nv, TYPE v1,TYPE v2 ); void glEvalMesh2fd(GLeum mode, GLint i1, GLint
42、 i2 , GLint j1,GLint j2);,2.3 OpenGL中参数曲面的绘制,绘制Bzier曲面实例,线框Bzier曲面,2.3 OpenGL中参数曲面的绘制,2.3.2 绘制NURBS曲面 NURBS曲面绘制函数 void gluNurbsSurface ( GLUnurbs *nurb, GLint sKnotCount, GLfloat *sKnot, GLint tKnotCount, GLfloat *tKnot, GLint sStride, GLint tStride, GLfloat *control, GLint sOrder, GLint tOrder, GLe
43、num type);nurb是NURBS曲面对象的指针; sKnotCount是参数U方向的节点数目; sKnot是参数U方向的节点数组; tKnotCount是参数V方向的节点数目; tKnot是参数V方向的节点数组; sStride、 tStride是U 、V方向上相邻两节点之间地址偏移量; control是控制顶点数组的头指针; sOrder和 tOrder是U 、V方向的阶数; type是曲面顶点的类型,2.3 OpenGL中参数曲面的绘制,NURBS曲面绘制实例,作 业,在Modeling菜单项中添加“曲线-Bzier曲线”项,连续在绘制窗口点击生成控制顶点,绘制G1连续的Bzier曲线集合; 根据线动成面的原理,设置该拼接曲线绕某一坐标轴旋转360度,绘制所形成的曲面; 给曲面设置相应的颜色; *(加分题)可交互设置任意旋转轴;,作 业,在Modeling菜单项中添加“曲面-Bzier曲面拼接”项,根据给定控制网格顶点,绘制两个给定的33 Bzier曲面片; 请在这两个曲面片之间生成一个中间曲面连接两个曲面片,并保证三个曲面片之间G1连续; 用小方块绘出控制顶点,并用键盘“C”键显示或隐藏控制顶点。请给定曲面片的控制顶点用白色显示,中间曲面片的控制顶点用蓝色; 拖动鼠标可旋转坐标系观察绘制出的曲面; 中间曲面片要用区别于给定曲面的颜色绘制。,