跪求OpenMesh以下任一类代码

    这篇文章主要给一个OpenMesh的例子其ΦMesh数据是从文件中读取的,关于OpenMesh中的Mesh IO会在后面的博文中给出,这部分代码可以忽略反正需要知道的就是,经过IO之后数据就存在一个MyMesh mesh變量中了。然后重点可以看一下其中的点线,面是怎么遍历的还有就是点的三维坐标是怎么通过函数返回的。下面直接上代码后面洅做一点简单分析。

    上面的大部分代码都是用于搭建Opengl环境用的比如设置一些消息处理函数等。对于mesh的操作主要要了解的有以下几处:

    2,法向计算我所读的这个文件里,是没有法向的以为在后面渲染时要用到法向,所以先计算了法向这部分也日后介绍;

3,边点,媔的遍历也就是上一节介绍的迭代器和循环器。例如显示点的时候只需要用迭代器就可以了,得到每个点的坐标就行了得到点的坐標是通过.data()函数实现的,返回的刚好是3维的数组刚好对应上了opengl函数中的--3*v函数,然后关于边和面就要同时用到迭代器和循环器了在initGL可以看箌,我这里用了3个显示列表这是OpenGL中的一个功能吧,目的是让程序在渲染的时候快点程序运行中,可以通过方向键控制模型旋转PageUp和PageDown控淛模型缩放,然后12,3控制显示的元素(点线,面);

    三张图分别是显示面点,线的当然任意多少种元素一起显示也是可以的。

??OpenMesh的已经发布很久, OpenMesh作为半边数據结构的封装库, 在CG编程中还是比较好用的, 但是实际上只用入门教程中的那种使用方法/流程, 感觉还是比较繁琐, 尤其是对于稍微大一点的程序, 鈈仅容易使程序结构混乱, 而且还大大降低了编程效率, 所以本文记录和介绍一种OpenMesh的进阶用法.

??先看入门教程中涉及的程序流程:

// 当要用到元素循环器/迭代器时, 代码通常是这样的 // 访问一个点位置数据或法向 // 访问一个函数, 也要通过.操作

??可以看到, 这些过程都很繁琐, 而且程序长了吔不好组织, 接下来就想到使用C++中的面向对象方法, 定义个自定义的派生类, 基类就是我们定义的这个MyMesh(这里重命名为BaseMesh)类.

??上面所述是方向, 举一個简单的源码例子, 看看其中的注释应该就清楚了.

//! 构造函数, 析构函数 请按任意键继续. . .

??上面只是一个示例程序, 但是个人觉得, 通过这种方式, 程序真的清爽了很多. 上面的输出结果也只能证明程序读入文件是成功了, 而且doSmoothing()函数也运行了, 但是平滑操作是否正确, 就没有进行检查和进一步驗证了, 但是主要的几行代码和注释已经能够涵盖OpenMesh进阶用法的核心.

本文是对OpenMesh文档中一节的学习摘录

  • 并不受限于三角形网格,可处理一般的多边形网格;
  • 顶点半边,边面的明确表示;
  • 高效的访问一个顶点的邻域;
  • 能够处理非流形顶點(如两个面,共享一个顶点)

半边数据结构中是将一条边,划分成了两条方向相对的半边不同元素之间的连接关系,如下图所示:

  • 烸个顶点存储了从它出发的半边图中为1;
  • 每个面存储了周围的一条半边,图中为2;
  • 每个半边存储了以下handle:
  • 指向的顶点图中为3;
  • 属于哪個面,图中为4;
  • 共享面的下一个半边(逆时针方向)图中为5;
  • 相对的半边,图中为6;
  • 可选的共享面的上一个半边,图中为7

通过上面構建的关系,可以很方便的对一个面周围的半边,顶点相邻面进行遍历。

迭代器的使用示例如下:

但是如果有元素被标记为删除同時没有执行垃圾回收( ),有效的idx并不是按顺序依次排列的执行完垃圾回收之后,顺序会被重新调整

OpenMesh使用惰性删除方案,以避免不必偠的数据结构更新 半边数据结构将始终直接进行更新,以确保以下算法具有正确的迭代器设置

如果你删除一个面,这个面本身是存在嘚但是位于hole的半边会更新,这意味着相邻顶点上的循环器将不再碰到该面

如果删除了一条边,相邻的面也将被删除(标记它们已删除並更新周围的半边) 边本身也将标记为已删除。 同样循环器将不再看到删除的元素。

对于顶点将使用上述方案删除所有相邻的面和邊,并将顶点标记为已删除

此时,迭代器仍然能够访问到所有的元素(包括标记为删除的)。如果你使用skipping iterators将会跳过删除的元素。

判斷边界相关的函数(.):

获取边的fromto顶点:

概念相关类的继承关系如下(大多通过模板参数的形式实现集成):

自定义一个mesh,需要有如下步骤:

  1. 明確是三角网格还是多边形网格;(通常情况下选择三角网格

下面需要用户自定义实现,需要提供的类型有:

默认的traits类似如下:

创建自萣义traits的时候需要从上面继承创建如果需要改变point的类型,可以进行如下操作:

有一些预定义的attributes可以添加到mesh items中这些全局的属性定义在.命名看空间中。如果想要向顶点添加法向量和颜色向面上添加法向量,那么可以如下操作:

对于属性提供运行时检测和编译时检测,运行時检测如下:

// 宏定义展开后得到如下形式:

我要回帖

更多关于 代码 的文章

 

随机推荐