北仑网站制作,网站的域名是什么意思,wordpress3.4,东莞网站建设it s【OpenMesh】OpenMesh实现增量网格重构 本文实现的为增量网格重构#xff08;incremental remesh#xff09;算法思想如下#xff1a; 接收一个目标边长作为输入#xff1b;遍历所有边#xff0c;边长度大于目标边长的4/3时#xff0c;认为是长边#xff0c;将在该边中…【OpenMesh】OpenMesh实现增量网格重构本文实现的为增量网格重构incremental remesh算法思想如下接收一个目标边长作为输入遍历所有边边长度大于目标边长的4/3时认为是长边将在该边中心点新增点分割该边做相应的连接操作遍历所有边若边长度小于目标边长的4/5时认为是短边将于邻接边合并翻转边使三角形的内角尽可能的趋近于60避免钝角对模型进行切向平滑操作。对上述步骤循环5次左右即可得到较为均匀的网格。算法具体实现时使用了OpenMesh库使用了库中自带的函数包含split()、collapse()、flip()和smooth()函数。main()mesh.request_vertex_status();mesh.request_edge_status();mesh.request_halfedge_status();mesh.request_face_status();EdgeFlipFunc(mesh);doubletargetLength50;for(inti0;i5;i){EdgeSplitFunc(mesh,targetLength);EdgeColapaseFunc(mesh,targetLength);EdgeFlipFunc(mesh);MeshSmoothFunc(mesh);mesh.garbage_collection();}需要request_XXXX_status()首先进行一次flip操作能提高某些自动生成的网格的质量如openmesh中构建一个平行四边形左下角为起点向右倾斜这时使用TriMesh_ArrayKernelT的mesh会自动连接点0和2显然边0-2的三角化方式生成的三角网格质量没有连接1-3的方式好garbage_collection()因未仔细研究所以尽量都添加上了EdgeSplitFunc()voidEdgeSplitFunc(MyMeshmesh,doubletargetLength){doublemaxtargetLength*4/3;MyMesh::EdgeIterEnd(mesh.edges_end());OpenMesh::Vec3d midPt;for(MyMesh::EdgeIter itermesh.edges_sbegin();iter!End;iter){if(max(mesh.point((*iter).v0())-mesh.point((*iter).v1())).length()){midPt(mesh.point((*iter).v0())mesh.point((*iter).v1()))/2;mesh.split(*iter,(mesh.point((*iter).v0())mesh.point((*iter).v1()))/2);)/2endl;}}mesh.garbage_collection();}4/3为经验值使用MyMesh::EdgeIter End(mesh.edges_end())而不是iter!mesh.edges_end()是为了避免递归的分割长边。一次循环中只分割当前存在的边不分割新生成的边。EdgeColapaseFunc()voidEdgeColapaseFunc(MyMeshmesh,doubletargetLength){doublemintargetLength*4/5;MyMesh::EdgeIterEnd(mesh.edges_end());for(autoitermesh.edges_sbegin();iter!End;iter){if((*iter).is_boundary()||(*iter).v0().is_boundary()||(*iter).v1().is_boundary())continue;if(min(mesh.point((*iter).v0())-mesh.point((*iter).v1())).length()){if(mesh.is_collapse_ok((*iter).h0()))mesh.collapse((*iter).h0());if(mesh.is_collapse_ok((*iter).h1()))mesh.collapse((*iter).h1());}}mesh.garbage_collection();}同split4/5是经验值同样为了避免递归合并短边使用了MyMesh::EdgeIter End(mesh.edges_end());合并短边时要求合并的边不是网格边界边严格的边的两个点也不可以是边界点合并短边使用的半边结构带有方向为避免改变网格拓扑EdgeFlipFunc()voidEdgeFlipFunc(MyMeshmesh){doubleorigin,after;MyMesh::EdgeIter iter;for(itermesh.edges_sbegin();iter!mesh.edges_end();iter){if(mesh.is_flip_ok(*iter)){origin(mesh.point((*iter).v0())-mesh.point((*iter).v1())).length();mesh.flip(*iter);after(mesh.point((*iter).v0())-mesh.point((*iter).v1())).length();if(originafter)mesh.flip(*iter);}}mesh.garbage_collection();}flip只是简单的判断两种方式边的长度大小使用短的那一种方式MeshSmoothFunc()voidMeshSmoothFunc(MyMeshmesh){OpenMesh::Smoother::SmootherTMyMesh::Component comOpenMesh::Smoother::SmootherTMyMesh::Tangential;OpenMesh::Smoother::SmootherTMyMesh::Continuity conOpenMesh::Smoother::SmootherTMyMesh::C0;OpenMesh::Smoother::JacobiLaplaceSmootherTMyMeshsmoother(mesh);smoother.initialize(com,con);smoother.smooth(5);}需要使用切向平滑带有法向的平滑会使网格变成处在一个平面参考文献Botsch M , Kobbelt L . A Remeshing Approach to Multiresolution Modeling[C]// Second Eurographics Symposium on Geometry Processing, Nice, France, July 8-10, 2004. 2004. http://www.graphics.rwth-aachen.de/media/papers/remeshing1.pdf