- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于OpenGL的IGES格式文件中的裁剪曲面绘制
OpenGL 带有绘制NURBS 曲面与NURBS 曲线的接口,裁剪曲面是IGES 文件中的一种
实体类型,类型号为144。其参数的数据结构如下图所示:
PTS 指向被修剪曲面的指针,可以是实体类型号为128(NURBS 曲面),120(旋转曲面),
122(扫掠面)等。由于OpenGL 只带有NURBS 曲面的接口,因此在实际绘制的时候,其
余类型的曲面都要转化为NURBS 曲面,转化方法可以参考《计算机辅助几何设计与非
均匀有理B 样条》 施法中。
N1 如其描述,如果为0,则说明这个曲面在其外边界处没有进行裁剪。
N2 是内边界的个数。
PT0 为指向裁剪曲面外边界的单闭合曲线的指针,指向的实体类型号为142 (参数曲面
实体上的曲线)。
PTI1 - PTIN2 为指向裁剪曲面内边界的单闭合曲线的指针(如果有内边界),指向的
实体类型号也为142。
需要提取PT0,PTI1- PTIN2 这些指针,找到对应的闭合曲线。以外边界指针PT0 的提
取为例。
PT0 指向一个142 的实体类型,如下图所示。
而实体类型142 也有几个数据,为了得到最终的闭合曲线,还需要进行一些分析与处理。
142 的参数数据如下图所示
SPTR 与与之匹配的144 中的PTS 是一样的,指向同一个需要被裁剪的曲面。BPTR 则
是闭合裁剪曲线的指针,它是定义在被裁剪曲面S 的参数空间中的曲线B,而CPTR 则
是指向曲线B 映射到欧几里德三维空间后的曲线C,PREF 是系统推荐使用哪种曲线作
为闭合曲线,1=SoB 推荐则是推荐使用BPTR 指向的闭合曲线,2=C 推荐则是推荐CPTR
指向的闭合曲线,大多数情况下都是SoB 推荐,目前我还没见过C 推荐的。
有了BPTR 这个指针,就可以得到最终的闭合曲线了。
闭合曲线是实体类型号为102 的组合曲线(Conposite Curve),它是由很多曲线(包括直
线段)组成的一个闭合环。它的第一个参数指明了它由多少个曲线构成。如图所示,它
由4 条线构成,后面的参数即为指向这些线的指针。
从图中可以看到,构成这个闭合环的线45,47,49,51 均为直线,类型号为110.提取
这些直线的数据,下面就可以用OpenGL 绘制出裁剪曲面了。
用OpenGL 绘制裁剪曲面,是在用OpenGL 绘制NURBS 曲面的基础上添加裁剪曲线完
成曲面的裁剪。也就是在原来绘制NURBS 曲面的函数之间添加修剪NURBS表面的函数。
格式如下
gluBeginSurface();
gluNurbsSurface(...);
gluBeginTrim();
gluPwlCurve(..);
gluNurbsCurve(..);
gluEndTrim()
一对gluBeginTrim()与gluEndTrim()之间是一个裁剪曲线闭环。这个闭环可以由若干条
直线段与NURBS 曲线组合而成,直线段可以由gluPwlCurve()绘制,NURBS 曲线由
gluNurbsCurve()绘制。下面详细说一下这两个函数。
gluPwlCurve(GLUnurbsObj *nobj,GLint count,GLfloat *array,GLint stride,GLenum
type);
第一个参数则是被裁剪的NURBS 曲面的指针,第二个参数则是构成这一段裁剪“曲线”
的顶点个数,构成曲线的顶点由第三个参数array 数组提供,第四个参数则是跨距,第
五个参数是枚举类型,不带权值的时候是GLU_MAP1_TRIM_2,带权的时候是
GLU_MAP1_TRIM_3。如果一个裁剪环都是由直线段构成,则只使用gluPwlCurve()即可。
如上图所示,有一个闭环ABCD ,满足闭环的条件是向量BA+CB+DC+AD = 0 (向量)。
如果是这种,则可以把ABCD 四个点存储为一个数组,调用一次gluPwlCurve()完成裁
剪,也可以采用四个数组,每个数组两个点表示一个直线,如AB ,BC,CD,DA,然后
调用四次gluPwlCurve()。后一种方法会造成数据的冗余,但是建议采用这种方法,原
因如下。
如果一个闭环像上图所示,由若干直线段与NURBS 曲线混合而成,如果想把直线段的
顶点放在一个数组内,这会给IGES 文件数据的提取带来很大的困难,因为IGES 文件
中一般是将这些线段顺序摆放的,如直线1,2,3,曲线4,直线5,曲线6 这样。一
个简洁的方式就是,按照这个顺序,一次调用gluPwlCurve()或gluNurbsCurve() 。
只要明白一点,一组gluBeginTrim()与gluE
文档评论(0)