OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt

上传人:小飞机 文档编号:1376579 上传时间:2022-11-16 格式:PPT 页数:48 大小:337.50KB
返回 下载 相关 举报
OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt_第1页
第1页 / 共48页
OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt_第2页
第2页 / 共48页
OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt_第3页
第3页 / 共48页
OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt_第4页
第4页 / 共48页
OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt》由会员分享,可在线阅读,更多相关《OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt(48页珍藏版)》请在三一办公上搜索。

1、1,OpenGL图形编程,武汉纺织大学数学与计算机学院,授课教师:陈永强 教授,4.网格化曲线曲面与实体造型,4.1网格化4.2曲线曲面4.3实体,4.1网格化,OpenGL只能直接显示简单的凸多边形。简单凸多边形就是多边形的边只在顶点处相交,没有重复的顶点,并且任何顶点都只有两条边相遇。如果需要显示凹多边形、中间有洞的多边形或者具有相交边的多边形,就必须分解为简单的凸多边形,即网格化。,4.1网格化,复杂多边形网格化步骤:创建一个网格化对象注册在网格化期间执行操作的回调函数 指定网格化属性指定一个或多个封闭多边形组成的轮廓,以创建并渲染分割后的多边形删除网格化对象,4.1网格化,创建网格化对

2、象GLUtesselator* gluNewTess(void);函数创建一个网格化对象,并返回一个指向该对象的指针,如果创建失败则返回NULL指针。,4.1网格化,网格化回调函数void glTessCallback(GLUtesselator* tessobj,GLenum type,void (* fn)() );函数将回调函数fn与网格化对象tessobj关联起来,类型由参数type指定。,4.1网格化,网格化属性void gluTessProperty(GLUtesselator *tessobj,GLenum property,GLdouble value );函数设置网格化对象t

3、essobj的property属性,其值设为value。最重要最复杂的是环绕规则,决定了多边形的“内部”和“外部”。,4.1网格化,定义多边形void glTessBeginPolygon(GLUtesselator *tessobj,void *user_data );void glTessEndPolygon(GLUtesselator *tessobj ); 此对函数将多边形同网格对象tessobj关联起来,参数user_data指向用户定义的数据。可以定义一条或多条轮廓线。void glTessBeginContour(GLUtesselator *tessobj);void glTe

4、ssEndContour(GLUtesselator *tessobj );此对函数指定一条封闭的轮廓线,默认将轮廓线中最后一个顶点和第一顶点相连。void gluTessVertex(GLUtesselator *tessobj,GLdouble coords3,void *vertex_data);函数指定轮廓线的一个顶点。,4.1网格化,删去网格化对象void gluDeleteTess(GLUtesselator *tessobj );删去网格化对象tessobj,并释放其占用的内存。,4.1网格化,例子红皮书tess.c,11,4.2 曲线曲面,4.2.1Bezier曲线曲面4.2.

5、2B样条曲线曲面,12,4.2.1Bezier曲线曲面,Bezier曲线Bezier曲线的求值函数:void glMap1fd(GLenum target, TYPE t1, TYPE t2, GLint stride, GLint order, const TYPE *points);参数target给出控制点数组表示的内容,一般取GL_MAP1_VERTEX_3,表示控制点数组存储控制点的三维点坐标。参数t1,t2表示Bezier曲线参数t的最小和最大值,一般为0.0和1.0。参数stride表数组points中一个坐标位置到另一个坐标位置的偏移量,对三维坐标数组,stride=3。参数o

6、rder指定Bezier曲线的阶数。参数points为指向控制点数组的指针。,13,4.2.1Bezier曲线曲面,Bezier曲线的生成步骤1.指定控制点坐标;2.设定求值函数;3.激活求值函数 glEnable(GL_MAP1_VERTEX_3)4.计算沿样条路径的位置并显示曲线 void glEvalCoord1fd(TYPE t);,14,4.2.1Bezier曲线曲面,Bezier曲线的生成步骤第4步还可以用以下函数来生成一组均匀分布的参数值,显示曲线 /指定曲线参数t从t1开始经过n步均匀地变为t2。 glMapGrid1fd(GLint n,TYPE t1,TYPE t2); /

7、指定从第n1个到第n2个参数(由glMapGrid1算出)绘制 glEvalMesh1(GLenum mode,GLint n1,GLint n2);参数mode取值为GL_POINT或GL_LINE,表示以点或折线的形式显示曲线,15,4.2.1Bezier曲线曲面,Bezier曲面Bezier曲面的求值函数: void glMap2fd(GLenum target, TYPE u1, TYPE u2, GLint ustride, GLint uorder, TYPE v1, TYPE v2, GLint vstride, GLint vorder, const TYPE *points)

8、;参数u1,u2,v1,v2分别表示Bezier曲面参数u和v的最大最小值。参数ustride和vstride分别表示数组points中相邻控制点的偏移量。参数uorder和vorder指定Bezier曲面的阶数。参数points为指向控制点坐标数组的指针。,16,4.2.1Bezier曲线曲面,Bezier曲面的生成步骤1.指定控制点坐标;2.设定求值函数;3.激活求值函数 glEnable(GL_MAP2_VERTEX_3)4.计算沿样条路径的位置并显示曲面glEvalCoord2fd(TYPE u, TYPE v);,17,4.2.1Bezier曲线曲面,Bezier曲面的生成步骤第4步

9、还可以用以下函数来生成一组均匀分布的参数值,显示曲面glMapGrid2fd(GLint nu,TYPE u1,TYPE u2, GLint nv,TYPE v1,TYPE v2);glEvalMesh2(GLenum mode,GLint nu1,GLint nu2,GLint nv1,GLint nv2);参数mode取值为GL_POINT、GL_LINE和GL_FILL,表示以点、折线或填充面的形式显示曲面,4.2.1Bezier曲线曲面,例子教材【程序8-2】红皮书bezcurve.c bezsurf.c bezmesh.c texturesurf.c,19,4.2.2B样条曲线曲面,

10、在GLU库中,提供的B样条曲线曲面接口程序称为“NURBS”函数,但可以用来生成既不是非均匀也不是有理的B样条。“NURBS”函数可以显示具有均匀结点间隔的多项式B样条,还可以用来生成Bezier样条、有理或非有理样条等。,20,4.2.2B样条曲线曲面,NURBS曲线曲面绘制的步骤:1.光照;2.指定NURBS对象;3.设置NURBS对象属性;4.错误通知;5.创建NURBS曲线曲面。,21,4.2.2B样条曲线曲面,1.光照如果要对NURBS曲面应用光照,可以调用函数使曲面自动生成面法线。 glEnable(GL_AUTO_NORMAL);也可以自己计算面法线。,22,4.2.2B样条曲线

11、曲面,2.指定NURBS对象指定一个NURBS对象,这个对象既可以是曲线也可以是曲面,然后使用函数GLUnurbsObj* gluNewNurbsRenderer(void);创建一个指向该对象的指针,以便在创建时使用。,23,4.2.2B样条曲线曲面,2.指定NURBS对象具体程序: GLUnurbsObj *curveName; curveName=gluNewNurbsRenderer();如果系统没有足够的存储容量来存储NURBS对象,gluNewNurbsRenderer函数会返回0值。,24,4.2.2B样条曲线曲面,2.指定NURBS对象当NURBS对象不需要再使用时,可以使用函

12、数删除NURBS对象。gluDeleteNurbsRenderer(curveName);删除名为curveName的NURBS对象。,25,4.2.2B样条曲线曲面,3.设置NURBS对象属性设置NURBS对象的属性,包括用于渲染的多边形的最大尺寸或线段的最大长度。 void gluNurbsProperty(GLUnurbsObj *nobj, GLenum property, GLfloat value);参数nobj指定需要设置属性的对象。参数property指定设置属性名称。参数value指定属性的值。,26,4.2.2B样条曲线曲面,3.设置NURBS对象属性Property属性名

13、称与参数value取值如下属性名称为GLU_DISPLAY_MODE,指定显示模式时:value默认值为GLU_FILL,表已填充方式显示曲面对象;Value值为GLU_OUTLINE_POLYGON,表以网格多边形的轮廓方式显示曲面;Value值为GLU_OUTLINE_PATCH,不显示网格多边形,仅显示曲面轮廓,包括指定的修剪曲线。,27,4.2.2B样条曲线曲面,3.设置NURBS对象属性Property属性名称与参数value取值如下属性名称为GLU_NURBS_MODE,指定NURBS曲线曲面模式时:value默认值为GLU_NURBS_RENDERER,表只对曲面进行绘制而不在回

14、调中产生网格数据;Value值为GLU_NURBS_TESSELLATOR,表返回经过网格化处理得到的数据。,28,4.2.2B样条曲线曲面,3.设置NURBS对象属性Property属性名称与参数value取值如下属性名称为GLU_CULLING,用于确定是否剔除操作:value为GLU_TRUE,启用剔除功能,使得曲面对象如果在观察空间之外将不执行网格化,以提高性能;Value为GLU_FALSE,不启用剔除功能。,29,4.2.2B样条曲线曲面,3.设置NURBS对象属性Property属性名称与参数value取值如下属性名称为GLU_SAMPLING_METHOD,指定NURBS对象如

15、何网格化:Value默认值为GLU_PATH_LENGTH,指定网格化得到的多边形的最大边长(单位为象素)不能超过属性GLU_SAMPLING _TOLERANCE的值;Value为GLU_PARAMETRIC_ERROR,指定网格化得到的多边形与原来曲线曲面的距离(单位为象素) 不能超过GLU_PARAMETRIC_TOLERANCE的值;Value为GLU_OBJECT_PATH_LENGTH和GLU_OBJECT_PARAMETRIC_ERROR时,与前类似,只是距离单位不是象素,而是物体空间坐标单位长度;Value为GLU_DOMAIN_DISTANCE,在u和v方向上分别根据属性GL

16、U_U_STEP和GLU_V_STEP的值决定每个单位长度内有多少个样本点。,30,4.2.2B样条曲线曲面,3.设置NURBS对象属性Property属性名称与参数value取值如下属性名称为GLU_SAMPLING_TOLERENCE,参数value指定经网格化处理得到的多边形的最大边长;属性名称为GLU_PARAMETRIC_TOLERENCE,参数value指定经网格化处理得到的多边形与原来曲线之间的最大距离;以上两个属性将根据属性GLU_SAMPLING_METHOD确定边长的单位是象素还是物体空间坐标长度。,31,4.2.2B样条曲线曲面,3.设置NURBS对象属性Property

17、属性名称与参数value取值如下属性名称为GLU_U_STEP和GLU_V_STEP ,参数value指定在u或v方向上每单位长度内有多少采样点,其默认值为100。注意的是,采样方式应该置为GLU_DOMAIN_DISTANCE。,32,4.2.2B样条曲线曲面,3.设置NURBS对象属性Property属性名称与参数value取值如下属性名称为GLU_AUTO_LOAD_MATRIX,参数value值为GL_TRUE时从OpenGL服务器上下载用于观察、投影和视区变换的矩阵;否则,如果该值为GL_FALSE,则必须使用函数gluLoadSamplingMatrices()来提供这些矩阵。函数

18、gluLoadSamplingMatrices()原型为Void gluLoadSamplingMatrices(GLUnurbsObj *nobj,const GLfloat modelMatrix16,const GLfloat projMatrix16,const Glint viewport4);,33,4.2.2B样条曲线曲面,3.设置NURBS对象属性获得NURBS属性的值,使用函数void gluGetNurbsProperty(GLUnurbsObj *nobj,GLenum property,GLfloat *value);通过参数value返回NURBS对象nobj的pro

19、perty属性值。,34,4.2.2B样条曲线曲面,4.错误通知调用函数 void gluNurbsCallback(GLUnurbsObj *nobj, GLenum which, void(*fn)(GLenum errorCode);将函数fn注册为错误回调函数。参数which指定回调函数的类型,对于错误检查,其取值为GLU_ERROR。当NURBS函数检测到错误时,将使用错误代码作为唯一的参数调用函数fn。errorCode的取值为37种错误条件,可以使用函数gluErrorString(errorCode)获得错误代码的含义。,35,4.2.2B样条曲线曲面,5.创建NURBS曲线曲

20、面 曲线在 void gluBeginCurve(GLUnurbsObj *nobj); void gluEndCurve(GLUnurbsObj *nobj);之间一次或多次调用函数gluNurbsCurve():,4.2.2B样条曲线曲面,5.创建NURBS曲线曲面曲线void gluNurbsCurve(GLUnurbsObj *nobj, GLint uknot_count, GLfloat *ukont, GLint u_stride, GLfloat *ctlarray, GLint uorder, GLenum type);,37,4.2.2B样条曲线曲面,5.创建NURBS曲线

21、曲面 曲面:在 void gluBeginSurface(GLUnurbsObj *nobj); void gluEndSurface (GLUnurbsObj *nobj);之间调用gluNurbsSurface() :,4.2.2B样条曲线曲面,5.创建NURBS曲线曲面 曲面:void gluNurbsSurface (GLUnurbsObj *nobj, GLint uknot_count, GLfloat *ukont, GLint vknot_count, GLfloat *vkont, GLint u_stride, GLint v_stride, GLfloat *ctlarr

22、ay, GLint uorder, GLint vorder, GLenum type);,4.2.2B样条曲线曲面,例子教材【程序8-4】红皮书surface.c,40,1.GLUT库中的多面体函数,4.3实体,表4.1 GLUT生成规则多面体的函数,41,2.GLUT库中的二、三次曲面绘制实体或线框球面void glutSolidSphere/glutWireSphere (GLdouble radius, GLint slices, GLint stacks);绘制实体或线框圆锥面void glutSolidCone/glutWireCone (GLdouble radius, GLdo

23、uble height, GLint slices, GLint stacks);,4.3实体,42,2.GLUT库中的二、三次曲面绘制实体或线框圆环void glutSolidTorus/ glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint slices,GLint stacks);绘制实体或线框茶壶void glutSolidTeapot/glutWireTeapot (GLdouble size);,4.3实体,4.3实体,3.GLU二次几何体通过网格化并用多边形逼近来模拟二维和三维几何体。,4.3实体,3.GL

24、U二次几何体渲染二次几何体步骤:1)创建一个二次几何体对象 GLUquadricObj* gluNewQuadric()2)指定二次对象的渲染属性 绘制模式/法线/法线方向/纹理坐标3)注册一个错误处理回调函数 gluQuadricCallback()4)根据二次对象类型调用相应的渲染函数 材质/光照5)删除二次对象 gluDeleteQuadric(),4.3实体,3.GLU二次几何体二次对象属性绘制模式 gluQuadricDrawStyle()法线类型 gluQuadricNormals()纹理坐标 gluQuadricTexture()法线方向 gluQuadricOrientation(),46,3.GLU二次几何体定义一个二次几何体 GLUquadricObj *sphere;激活二次几何体绘制器 sphere = gluNewQuadric( );指定二次几何体的绘制方式 gluQuadricDrawStyle(sphere, GLU_LINE);,4.3实体,47,绘制二次几何体图元球 gluSphere()圆柱/圆锥/圆台 gluCylinder()圆盘 gluDisk()部分圆盘 gluPartialDisk(),4.3实体,4.3实体,3.GLU二次几何体红皮书quadric.c,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号