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

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

《OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt》由会员分享,可在线阅读,更多相关《OpenGL图形编程4网格化曲线曲面与实体造型(陈永强)ppt课件.ppt(48页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、1OpenGL图形编程图形编程武汉纺织大学数学与计算机学院武汉纺织大学数学与计算机学院授课教师:陈永强授课教师:陈永强 教授教授4.网格化曲线曲面与实体造型网格化曲线曲面与实体造型o 4.1网格化网格化o 4.2曲线曲面曲线曲面o 4.3实体实体4.1网格化网格化o OpenGL只能直接显示简单的凸多边形。简单只能直接显示简单的凸多边形。简单凸多边形就是多边形的边只在顶点处相交,没凸多边形就是多边形的边只在顶点处相交,没有重复的顶点,并且任何顶点都只有两条边相有重复的顶点,并且任何顶点都只有两条边相遇。遇。o 如果需要显示凹多边形、中间有洞的多边形或如果需要显示凹多边形、中间有洞的多边形或者具

2、有相交边的多边形,就必须分解为简单的者具有相交边的多边形,就必须分解为简单的凸多边形,即网格化。凸多边形,即网格化。4.1网格化网格化p 复杂多边形网格化步骤:复杂多边形网格化步骤:n 创建一个网格化对象创建一个网格化对象n 注册在网格化期间执行操作的回调函数注册在网格化期间执行操作的回调函数 n 指定网格化属性指定网格化属性n 指定一个或多个封闭多边形组成的轮廓,以创建并指定一个或多个封闭多边形组成的轮廓,以创建并渲染分割后的多边形渲染分割后的多边形n 删除网格化对象删除网格化对象4.1网格化网格化n 创建网格化对象创建网格化对象GLUtesselator* gluNewTess(void)

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

4、essobj,GLenum property,GLdouble value );函数设置网格化对象函数设置网格化对象tessobj的的property属性属性,其值设为,其值设为value。最重要最复杂的是环绕规则,决定了多边形的最重要最复杂的是环绕规则,决定了多边形的“内部内部”和和“外部外部”。 4.1网格化网格化n定义多边形定义多边形void glTessBeginPolygon(GLUtesselator *tessobj,void *user_data );void glTessEndPolygon(GLUtesselator *tessobj ); 此对函数将多边形同网格对象此对函

5、数将多边形同网格对象tessobj关联起来,参数关联起来,参数user_data指向用户定义的数据。可以定义一条或多条轮廓线。指向用户定义的数据。可以定义一条或多条轮廓线。void glTessBeginContour(GLUtesselator *tessobj);void glTessEndContour(GLUtesselator *tessobj );此对函数指定一条封闭的轮廓线,默认将轮廓线中最后一个顶点和第此对函数指定一条封闭的轮廓线,默认将轮廓线中最后一个顶点和第一顶点相连。一顶点相连。void gluTessVertex(GLUtesselator *tessobj,GLdou

6、ble coords3,void *vertex_data);函数指定轮廓线的一个顶点。函数指定轮廓线的一个顶点。4.1网格化网格化n 删去网格化对象删去网格化对象void gluDeleteTess(GLUtesselator *tessobj );删去网格化对象删去网格化对象tessobj,并释放其占用的内存。并释放其占用的内存。4.1网格化网格化o 例子例子红皮书红皮书tess.c114.2 曲线曲面曲线曲面o 4.2.1Bezier曲线曲面曲线曲面o 4.2.2B样条曲线曲面样条曲线曲面124.2.1Bezier曲线曲面曲线曲面o Bezier曲线曲线Bezier曲线的求值函数:曲线的

7、求值函数: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中一个坐标位置到另一个坐标位置的偏移量,对三维

8、坐标数中一个坐标位置到另一个坐标位置的偏移量,对三维坐标数组,组,stride=3。参数参数order指定指定Bezier曲线的阶数。曲线的阶数。参数参数points为指向控制点数组的指针。为指向控制点数组的指针。134.2.1Bezier曲线曲面曲线曲面o Bezier曲线的生成步骤曲线的生成步骤1.指定控制点坐标;指定控制点坐标;2.设定求值函数;设定求值函数;3.激活求值函数激活求值函数 glEnable(GL_MAP1_VERTEX_3)4.计算沿样条路径的位置并显示曲线计算沿样条路径的位置并显示曲线 void glEvalCoord1fd(TYPE t);144.2.1Bezier曲

9、线曲面曲线曲面o Bezier曲线的生成步骤曲线的生成步骤第第4步还可以用以下函数来生成一组均匀分布的参数值,显示曲线步还可以用以下函数来生成一组均匀分布的参数值,显示曲线 /指定曲线参数指定曲线参数t从从t1开始经过开始经过n步均匀地变为步均匀地变为t2。 glMapGrid1fd(GLint n,TYPE t1,TYPE t2); /指定从第指定从第n1个到第个到第n2个参数(由个参数(由glMapGrid1算出算出)绘制)绘制 glEvalMesh1(GLenum mode,GLint n1,GLint n2);参数参数mode取值为取值为GL_POINT或或GL_LINE,表示以点或折

10、线的形式表示以点或折线的形式显示曲线显示曲线154.2.1Bezier曲线曲面曲线曲面o 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);参数参数u1,u2,v1,v2分别表示分别表示Bezier曲面参数曲面参数u和和v的最大最小值。的最大最小值。参数参数ustride和和vstride分别表示

11、数组分别表示数组points中相邻控制点的偏移量。中相邻控制点的偏移量。参数参数uorder和和vorder指定指定Bezier曲面的阶数。曲面的阶数。参数参数points为指向控制点坐标数组的指针。为指向控制点坐标数组的指针。164.2.1Bezier曲线曲面曲线曲面o Bezier曲面的生成步骤曲面的生成步骤1.指定控制点坐标;指定控制点坐标;2.设定求值函数;设定求值函数;3.激活求值函数激活求值函数 glEnable(GL_MAP2_VERTEX_3)4.计算沿样条路径的位置并显示曲面计算沿样条路径的位置并显示曲面glEvalCoord2fd(TYPE u, TYPE v);174.2

12、.1Bezier曲线曲面曲线曲面o Bezier曲面的生成步骤曲面的生成步骤第第4步还可以用以下函数来生成一组均匀分布的参数值,显示曲面步还可以用以下函数来生成一组均匀分布的参数值,显示曲面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,表示以点、表示以点、折线或填充面的形式显示曲面折线或填充面的形式显示曲

13、面4.2.1Bezier曲线曲面曲线曲面o 例子例子教材教材【程序程序8-2】红皮书红皮书bezcurve.c bezsurf.c bezmesh.c texturesurf.c194.2.2B样条曲线曲面样条曲线曲面o 在在GLU库中,提供的库中,提供的B样条曲线曲面接口程序样条曲线曲面接口程序称为称为“NURBS”函数,但可以用来生成既不是函数,但可以用来生成既不是非均匀也不是有理的非均匀也不是有理的B样条。样条。o “NURBS”函数可以显示具有均匀结点间隔的函数可以显示具有均匀结点间隔的多项式多项式B样条,还可以用来生成样条,还可以用来生成Bezier样条、样条、有理或非有理样条等。有

14、理或非有理样条等。204.2.2B样条曲线曲面样条曲线曲面o NURBS曲线曲面绘制的步骤:曲线曲面绘制的步骤:1.光照;光照;2.指定指定NURBS对象;对象;3.设置设置NURBS对象属性;对象属性;4.错误通知;错误通知;5.创建创建NURBS曲线曲面。曲线曲面。214.2.2B样条曲线曲面样条曲线曲面o 1.光照光照如果要对如果要对NURBS曲面应用光照,可以调用函数曲面应用光照,可以调用函数使曲面自动生成面法线。使曲面自动生成面法线。 glEnable(GL_AUTO_NORMAL);也可以自己计算面法线。也可以自己计算面法线。224.2.2B样条曲线曲面样条曲线曲面o 2.指定指定

15、NURBS对象对象指定一个指定一个NURBS对象,这个对象既可以是曲线对象,这个对象既可以是曲线也可以是曲面,然后使用函数也可以是曲面,然后使用函数GLUnurbsObj* gluNewNurbsRenderer(void);创建一个指向该对象的指针,以便在创建时使用创建一个指向该对象的指针,以便在创建时使用。234.2.2B样条曲线曲面样条曲线曲面o 2.指定指定NURBS对象对象具体程序:具体程序: GLUnurbsObj *curveName; curveName=gluNewNurbsRenderer();如果系统没有足够的存储容量来存储如果系统没有足够的存储容量来存储NURBS对象,

16、对象,gluNewNurbsRenderer函数会返回函数会返回0值。值。244.2.2B样条曲线曲面样条曲线曲面o 2.指定指定NURBS对象对象当当NURBS对象不需要再使用时,可以使用函数对象不需要再使用时,可以使用函数删除删除NURBS对象。对象。gluDeleteNurbsRenderer(curveName);删除名为删除名为curveName的的NURBS对象。对象。254.2.2B样条曲线曲面样条曲线曲面o 3.设置设置NURBS对象属性对象属性设置设置NURBS对象的属性,包括用于渲染的多边形的最大尺寸或线段对象的属性,包括用于渲染的多边形的最大尺寸或线段的最大长度。的最大长

17、度。 void gluNurbsProperty(GLUnurbsObj *nobj, GLenum property, GLfloat value);参数参数nobj指定需要设置属性的对象。指定需要设置属性的对象。参数参数property指定设置属性名称。指定设置属性名称。参数参数value指定属性的值。指定属性的值。264.2.2B样条曲线曲面样条曲线曲面o 3.设置设置NURBS对象属性对象属性Property属性名称与参数属性名称与参数value取值如下取值如下属性名称为属性名称为GLU_DISPLAY_MODE,指定显示模式时:,指定显示模式时:value默认值为默认值为GLU_FI

18、LL,表已填充方式显示曲面对象;,表已填充方式显示曲面对象;Value值为值为GLU_OUTLINE_POLYGON,表以网格多边形的轮廓,表以网格多边形的轮廓方式显示曲面;方式显示曲面;Value值为值为GLU_OUTLINE_PATCH,不显示网格多边形,仅显示,不显示网格多边形,仅显示曲面轮廓,包括指定的修剪曲线。曲面轮廓,包括指定的修剪曲线。274.2.2B样条曲线曲面样条曲线曲面o 3.设置设置NURBS对象属性对象属性Property属性名称与参数属性名称与参数value取值如下取值如下属性名称为属性名称为GLU_NURBS_MODE,指定,指定NURBS曲线曲面模式时曲线曲面模式

19、时:value默认值为默认值为GLU_NURBS_RENDERER,表只对曲面进行绘制,表只对曲面进行绘制而不在回调中产生网格数据;而不在回调中产生网格数据;Value值为值为GLU_NURBS_TESSELLATOR,表返回经过网格化处,表返回经过网格化处理得到的数据。理得到的数据。284.2.2B样条曲线曲面样条曲线曲面o 3.设置设置NURBS对象属性对象属性Property属性名称与参数属性名称与参数value取值如下取值如下属性名称为属性名称为GLU_CULLING,用于确定是否剔除操作:,用于确定是否剔除操作:value为为GLU_TRUE,启用剔除功能,使得曲面对象如,启用剔除功

20、能,使得曲面对象如果在观察空间之外将不执行网格化,以提高性能;果在观察空间之外将不执行网格化,以提高性能;Value为为GLU_FALSE,不启用剔除功能。,不启用剔除功能。294.2.2B样条曲线曲面样条曲线曲面o3.设置设置NURBS对象属性对象属性Property属性名称与参数属性名称与参数value取值如下取值如下属性名称为属性名称为GLU_SAMPLING_METHOD,指定,指定NURBS对象如何网格化:对象如何网格化:Value默认值为默认值为GLU_PATH_LENGTH,指定网格化得到的多边形的最大边长(单,指定网格化得到的多边形的最大边长(单位为象素)不能超过属性位为象素)

21、不能超过属性GLU_SAMPLING _TOLERANCE的值;的值;Value为为GLU_PARAMETRIC_ERROR,指定网格化得到的多边形与原来曲线曲面,指定网格化得到的多边形与原来曲线曲面的距离(单位为象素)的距离(单位为象素) 不能超过不能超过GLU_PARAMETRIC_TOLERANCE的值;的值;Value为为GLU_OBJECT_PATH_LENGTH和和GLU_OBJECT_PARAMETRIC_ERROR时,与前类似,只是距离单位不是象时,与前类似,只是距离单位不是象素,而是物体空间坐标单位长度;素,而是物体空间坐标单位长度;Value为为GLU_DOMAIN_DIS

22、TANCE,在,在u和和v方向上分别根据属性方向上分别根据属性GLU_U_STEP和和GLU_V_STEP的值决定每个单位长度内有多少个样本点。的值决定每个单位长度内有多少个样本点。304.2.2B样条曲线曲面样条曲线曲面o 3.设置设置NURBS对象属性对象属性Property属性名称与参数属性名称与参数value取值如下取值如下属性名称为属性名称为GLU_SAMPLING_TOLERENCE,参数,参数value指定经指定经网格化处理得到的多边形的最大边长;网格化处理得到的多边形的最大边长;属性名称为属性名称为GLU_PARAMETRIC_TOLERENCE,参数,参数value指定指定经

23、网格化处理得到的多边形与原来曲线之间的最大距离;经网格化处理得到的多边形与原来曲线之间的最大距离;以上两个属性将根据属性以上两个属性将根据属性GLU_SAMPLING_METHOD确定边长的确定边长的单位是象素还是物体空间坐标长度。单位是象素还是物体空间坐标长度。314.2.2B样条曲线曲面样条曲线曲面o 3.设置设置NURBS对象属性对象属性Property属性名称与参数属性名称与参数value取值如下取值如下属性名称为属性名称为GLU_U_STEP和和GLU_V_STEP ,参数,参数value指定在指定在u或或v方向上每单位长度内有多少采样点方向上每单位长度内有多少采样点,其默认值为,其

24、默认值为100。注意的是,采样方式应该置为。注意的是,采样方式应该置为GLU_DOMAIN_DISTANCE。324.2.2B样条曲线曲面样条曲线曲面o 3.设置设置NURBS对象属性对象属性Property属性名称与参数属性名称与参数value取值如下取值如下属性名称为属性名称为GLU_AUTO_LOAD_MATRIX,参数,参数value值为值为GL_TRUE时从时从OpenGL服务器上下载用于观察、投影和视区变换的矩阵;否则,服务器上下载用于观察、投影和视区变换的矩阵;否则,如果该值为如果该值为GL_FALSE,则必须使用函数,则必须使用函数gluLoadSamplingMatrices

25、()来提供这些矩阵。()来提供这些矩阵。函数函数gluLoadSamplingMatrices()原型为原型为Void gluLoadSamplingMatrices(GLUnurbsObj *nobj,const GLfloat modelMatrix16,const GLfloat projMatrix16,const Glint viewport4);334.2.2B样条曲线曲面样条曲线曲面o 3.设置设置NURBS对象属性对象属性获得获得NURBS属性的值,使用函数属性的值,使用函数void gluGetNurbsProperty(GLUnurbsObj *nobj,GLenum pr

26、operty,GLfloat *value);通过参数通过参数value返回返回NURBS对象对象nobj的的property属性属性值。值。344.2.2B样条曲线曲面样条曲线曲面o 4.错误通知错误通知调用函数调用函数 void gluNurbsCallback(GLUnurbsObj *nobj, GLenum which, void(*fn)(GLenum errorCode);将函数将函数fn注册为错误回调函数。注册为错误回调函数。参数参数which指定回调函数的类型,对于错误检查,其取值为指定回调函数的类型,对于错误检查,其取值为GLU_ERROR。当当NURBS函数检测到错误时,

27、将使用错误代码作为唯一的参数调用函数函数检测到错误时,将使用错误代码作为唯一的参数调用函数fn。errorCode的取值为的取值为37种错误条件,可以使用函数种错误条件,可以使用函数gluErrorString(errorCode)获得错误代码的含义。获得错误代码的含义。354.2.2B样条曲线曲面样条曲线曲面o 5.创建创建NURBS曲线曲面曲线曲面 n 曲线曲线在在 void gluBeginCurve(GLUnurbsObj *nobj); void gluEndCurve(GLUnurbsObj *nobj);之间一次或多次调用函数之间一次或多次调用函数gluNurbsCurve():

28、4.2.2B样条曲线曲面样条曲线曲面o 5.创建创建NURBS曲线曲面曲线曲面n 曲线曲线void gluNurbsCurve(GLUnurbsObj *nobj, GLint uknot_count, GLfloat *ukont, GLint u_stride, GLfloat *ctlarray, GLint uorder, GLenum type);374.2.2B样条曲线曲面样条曲线曲面o 5.创建创建NURBS曲线曲面曲线曲面 n 曲面:曲面:在在 void gluBeginSurface(GLUnurbsObj *nobj); void gluEndSurface (GLUnur

29、bsObj *nobj);之间调用之间调用gluNurbsSurface() :4.2.2B样条曲线曲面样条曲线曲面o 5.创建创建NURBS曲线曲面曲线曲面 n 曲面:曲面:void gluNurbsSurface (GLUnurbsObj *nobj, GLint uknot_count, GLfloat *ukont, GLint vknot_count, GLfloat *vkont, GLint u_stride, GLint v_stride, GLfloat *ctlarray, GLint uorder, GLint vorder, GLenum type);4.2.2B样条曲

30、线曲面样条曲线曲面o 例子例子教材教材【程序程序8-4】红皮书红皮书surface.c40o 1.GLUT库中的多面体函数库中的多面体函数4.3实体实体函数说明glutSolidTetrahedron( )glutWireTetrahedron( )绘制中心位于世界坐标系原点的实心四面体和线框四面体,四面体的半径为 。glutSolidCube(size)glutWireCube(size)绘制中心位于世界坐标系原点的实心立方体和线框立方体,立方体的半径为size,size是一个双精度浮点值。glutSolidOctahedron ( )glutWireOctahedron ( )绘制中心位于

31、世界坐标系原点的实心八面体和线框八面体,八面体的半径为1.0。glutSolidDodecahedron( )glutWireDodecahedron( )绘制中心位于世界坐标系原点的实心12面体和线框12面体,12面体的半径为 。glutSolidIcosahedron( )glutWireIcosahedron( )绘制中心位于世界坐标系原点的实心20面体和线框20面体,20面体的半径为1.0。3表表4.1 4.1 GLUT生成规则多面体的函数生成规则多面体的函数341o 2.GLUT库中的二、三次曲面库中的二、三次曲面n 绘制实体或线框球面绘制实体或线框球面void glutSolidS

32、phere/glutWireSphere (GLdouble radius, GLint slices, GLint stacks);n 绘制实体或线框圆锥面绘制实体或线框圆锥面void glutSolidCone/glutWireCone (GLdouble radius, GLdouble height, GLint slices, GLint stacks);4.3实体实体42p2.GLUT库中的二、三次曲面库中的二、三次曲面n 绘制实体或线框圆环绘制实体或线框圆环void glutSolidTorus/ glutWireTorus(GLdouble innerRadius, GLdou

33、ble outerRadius, GLint slices,GLint stacks);n 绘制实体或线框茶壶绘制实体或线框茶壶void glutSolidTeapot/glutWireTeapot (GLdouble size);4.3实体实体4.3实体实体o 3.GLU二次几何体二次几何体通过网格化并用多边形逼近来模拟二维和三通过网格化并用多边形逼近来模拟二维和三维几何体。维几何体。4.3实体实体o 3.GLU二次几何体二次几何体渲染二次几何体步骤:渲染二次几何体步骤:1)创建一个二次几何体对象)创建一个二次几何体对象 GLUquadricObj* gluNewQuadric()2)指定二

34、次对象的渲染属性)指定二次对象的渲染属性 绘制模式绘制模式/法线法线/法线方向法线方向/纹理坐标纹理坐标3)注册一个错误处理回调函数)注册一个错误处理回调函数 gluQuadricCallback()4)根据二次对象类型调用相应的渲染函数)根据二次对象类型调用相应的渲染函数 材质材质/光照光照5)删除二次对象)删除二次对象 gluDeleteQuadric()4.3实体实体o 3.GLU二次几何体二次几何体二次对象属性二次对象属性n 绘制模式绘制模式 gluQuadricDrawStyle()n 法线类型法线类型 gluQuadricNormals()n 纹理坐标纹理坐标 gluQuadric

35、Texture()n 法线方向法线方向 gluQuadricOrientation()46o 3.GLU二次几何体二次几何体n 定义一个二次几何体定义一个二次几何体 GLUquadricObj *sphere;n 激活二次几何体绘制器激活二次几何体绘制器 sphere = gluNewQuadric( );n 指定二次几何体的绘制方式指定二次几何体的绘制方式 gluQuadricDrawStyle(sphere, GLU_LINE); 4.3实体实体47n 绘制二次几何体图元绘制二次几何体图元球球 gluSphere()圆柱圆柱/圆锥圆锥/圆台圆台 gluCylinder()圆盘圆盘 gluDisk()部分圆盘部分圆盘 gluPartialDisk() 4.3实体实体4.3实体实体o 3.GLU二次几何体二次几何体红皮书红皮书quadric.c

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com