资源描述:
《基于提升方法的蝶形细分曲面小波简化算法的实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、基于提升方法的蝶形细分曲面小波简化算法的实现郑贵锋2004.11.概述该程序实现了基于提升方法的蝶形细分曲面小波简化算法,该算法可参见王建民博士论文:三维CAD中的离散体造型方法研究及应用,P71-74。2.程序流程2.1读取控制网格net模型文件1)从net文件读取控制网格,用ControlNet控制网类保存,ControlNet类中分别用动态数组保存顶点、纹理与颜色:float*verts;float*texCoords;float*colors;net模型文件格式如下:BaseTexture%
2、s%d%d//基本纹理名称宽高GlossTexture%s%d%d//光滑纹理名称宽高EnvTexture%s%d%d//环境纹理名称宽高v%f%f%f//顶点坐标xyzt%f%f//纹理坐标xyc%f%f%f%f//颜色RGBAf%d%d%d%d%d%d%d%d%d%d//面顶点索引号(至少3个,最大10个)注:纹理与颜色部分不是必需,但如果存在纹理或颜色,则其与顶点数目必须保持一致,并按顺序从0起编索引号,与顶点索引一一对应。2)调整模型顶点数据,使其居中:计算所有顶点最大最小值,以其中间值为0
3、点调整所有顶点坐标值。X,y,z值分别处理。3)调整模型比例,使其不至于过大或过小:计算顶点x,y和z坐标最大值,以(适当最大值/原最大值)为因子乘顶点坐标更新所有顶点坐标。X,y,z使用相同因子。42.2转换成ButterflySurface类1)保存所有顶点、纹理、颜色数据到:float*controlVerts;//每顶点4个float:x,y,z,?float*controlTexCoords;//每顶点2个float:x,yunsignedchar*controlColors;//每顶点4
4、个单位:r,g,b,a.2)将每个面转为三角形片:取第0个顶点为三角形片的一个顶点,依次取2个顶点为三角形片的另两顶点,即分别取下面索引号的顶点组成三角形片:(0,1,2)、(0,2,3)、(0,3,4)、…然后将每个三角形片的顶点索引号依次保存在:int*controlFaces;//每三角形片占3个单位空间,保存的是顶点的索引,即在controlVerts中的序号3)将所有三角形片的边保存到下面数组里,不保存重复的边:ButterflyEdge*controlEdges;//每条边保存的是顶点的
5、索引并将边的索引号保存在:int*controlFaceEdges;//每三角形片占3个单位空间,保存的是边的索引,即在controlEdges中的序号4)为每个顶点生成边列表a)计算所有顶点法线:遍历所有三角形片,设三角形ABC,顶点A的法线为:AB叉乘叉乘:设矢量V1=(x1,y1,z1),V2=(x2,y2,z2).则V1叉乘V2为矢量:(y1*z2-z1*y2,z1*x2-x1*z2,x1*y2-y1*x2).点乘:设矢量V1=(x1,y1,z1),V2=(x2,y2,z2).则V1点乘V2
6、为标量:x1*x2+y1*y2+z1*z2.点乘亦表示:
7、V1
8、
9、V2
10、cos(a),其中a为V1、V2夹角AC再标准化标准化:设矢量V=(x,y,z),其标准化矢量是指:(x/d,y/d,z/d),其中d为x,y,z的平方和再开方,d即是V的度量。,顶点B、C的法线与A相同。若某顶点同时在多个三角形内,则取多次算得的法线的和,标准化后作为该顶点法线。b)根据之前保存的边数组controlEdges,很容易得到顶点关联的边,将每顶点的边的索引以链表保存下来。c)顶点的度限制在3与MAX_VERTEX
11、_VALENCE之间,MAX_VERTEX_VALENCE这里设为16。d)将边按角度排序:第0条边的角度为0,与第0条边的顺时针角度越大排到最后。排序方法:将边投射到切平面并标准化,计算点积即得夹角的cos值,再求acos即得角度值,注意若两者的叉积与法线异向时,求得角度应被360减,因我们要算的是顺时针角度。e)将排序后的边保存在:VertexEdges*controlVertEdges;//每单位保存的是一个顶点的已排序的边的索引值。5)以上得到的都是控制网格的数据,现在将其简单复制到显示时实
12、际用到的数组中:float*verts;//复制自controlVerts4VertexEdges*vertEdges;//复制自controlVertEdgesfloat*texCoords;//复制自controlTexCoordsunsignedchar*colors;//复制自controlColorsint*faces;//复制自controlFacesint*faceEdges;//复制自controlFaceEdgesButterflyEdge*edge