
openmesh详解
文章平均质量分 65
铿锵的玫瑰
业余爱好者
展开
-
基于vs2015中nuget插件的openmesh安装
如何安装nuget打开vs2015 点击菜单栏中的"工具"->"扩展与更新",选择nuget包管理器进行安装。 参考网址:https://docs.microsoft.com/zh-cn/nuget/what-is-nuget https://www.cnblogs.com/ShaYeBlog/p/5552893.html如何利...原创 2018-10-12 07:45:18 · 414 阅读 · 0 评论 -
迭代器与循环器的使用
首先,我们必须定义我们想要使用的网格类型。 这次我们使用三角形网格而不是多边形网格: 我们从文件中读取要平滑的网格: 一个平滑迭代分两步完成:对于每个顶点:计算其单环邻居的重心。 对于每个顶点:将顶点移动到计算的重心。这可以使用顶点迭代器轻松实现。 网格通过vertices_begin()和vertices_end()提供开始和结束迭代器。 为了计算重心,我们必须迭代当前顶点的单环邻域...原创 2018-10-15 07:27:51 · 491 阅读 · 0 评论 -
使用自定义属性
在上一个例子中,我们计算了每个顶点邻域的重心并将其存储在一个数组中。 如果我们可以将这些数据存储在网格中并让OpenMesh管理数据,那么它将更方便,更不容易出错。 如果我们可以动态地将这些属性附加到网格上会更有帮助。OpenMesh提供动态属性,可以附加到每个网格实体(顶点,面,边,半边和网格本身)。 我们区分自定义属性和标准属性。 自定义属性是任何用户定义的属性,可通过句柄和实体句柄(例如...原创 2018-10-15 07:27:41 · 556 阅读 · 0 评论 -
使用STL算法
由于OpenMesh迭代器(几乎)符合STL迭代器,因此可以在网格上应用STL算法。以下示例显示了如何使用STL for_each构造,因为它更易于阅读,并且可能比手写循环更有效。我们将定义一个提供平滑算法的类,从而定义一个可重用的组件。SmootherT类有两个仿函数,一个用于计算给定顶点的重心,另一个用于将顶点位置设置为相应的重心。 仿函数只是一个带有函数operator()(...)...原创 2018-10-15 07:27:35 · 298 阅读 · 0 评论 -
使用标准的属性
正如我们已经看到的,我们可以通过属性将其他数据绑定到网格实体。 OpenMesh提供了一组所谓的标准属性。 与自定义属性不同,它们具有一些特殊功能和不同的界面。下表列出了所有可用的标准属性以及可以使用它的合适实体。要向实体添加标准属性,只需使用适当的请求方法,例如request_face_normals()。 唯一的例外是位置(*)。 它无法添加,因为它永久可用,因此也无法删除。在这个...原创 2018-10-15 07:27:27 · 663 阅读 · 0 评论 -
使用网格属性与特征
与自定义属性不同,用户通过将类型传递给句柄来指定数据类型(例如,MyMesh :: FPropHandleT <int>),标准属性的数据类型由所谓的网格特征定义。 通过traits,我们可以自定义和扩展网格数据结构。 我们可以通过改变两个重要特征来做到这一点:更改位置,法线,颜色和纹理坐标的数据类型 扩展网格实体Vertex,Face,Edge和Halfedge每个自定义特征...原创 2018-10-15 07:27:12 · 1037 阅读 · 0 评论 -
使用特征扩展网格
设计的一个目标是高度可定制的数据结构。 使用特征技术使其成为可能。 我们再次选择更平滑的方式并展示另一种实现方式。注意顶点实体的定义。 我们使用提供的定义VertexTraits(它解决了相当不方便的模板定义)。 类似我们可以使用定义FaceTraits,EdgeTraits和HalfedgeTraits来扩展这些实体。 现在我们使用附加成员变量cog_和get / set-method对来增...原创 2018-10-15 07:27:04 · 408 阅读 · 0 评论 -
删除几何元素
如果我们希望我们的网格类能够删除顶点,面或边,我们必须扩展网格类的默认特征。 顶点,面和(半)边需要OpenMesh :: Attributes :: Status属性,如果删除了元素,该属性用于保存标记“已删除”。不是通过编译时的特征定义所需的属性,而是可以通过请求它们在运行时动态地请求属性。 在此示例中,我们要删除面,边和顶点,因此需要请求status属性。如果不通过特征启用属性,则必...原创 2018-10-15 07:26:57 · 837 阅读 · 0 评论 -
IO的选项使用
在读/写网格时可以使用OpenMesh :: IO :: Options类。 它通过位集中的启用/禁用位控制读写器模块的行为。 该类提供了一个用于启用,禁用和验证集合中的位的接口。 我们区分如下:这些位在读取或写入时具有不同的效果。 文件格式本身由文件名的扩展名选择。请注意,每个网格必须在加载相应选项之前请求标准属性。 例如,如果启用Options :: VertexNormal,则网...原创 2018-10-15 07:26:48 · 624 阅读 · 0 评论 -
存储自定义属性
OpenMesh专有的OM格式允许存储和恢复自定义属性以及标准属性。为此,我们必须使用命名的自定义属性,如下所示这里我们为网格上的顶点注册了一个名为“vprop_float”的浮点属性。 我们想要持久化的属性名称必须遵循一些规则:最大长度为256个字符。 保留前缀“v:”,“h:”,“e:”,“f:”和“m:”。 名称是区分大小写的。要实际使自定义属性持久化,我们必须在属性中设置持久...原创 2018-10-15 07:26:38 · 559 阅读 · 0 评论 -
构建一个立方体
对于每个程序,第一步是定义您的MyMesh类型。 OpenMesh支持常规多边形网格(面是具有不同数量顶点的多边形)以及专用三角形网格(所有面都是三角形)。 在这个例子中,我们想要从六个四边形构建一个立方体,因此我们选择多边形网格。 OpenMesh还支持不同的网格内核,指定内部存储所有顶点,边和面的方式(另请参见网格内核)。 但是,存储必须提供类似接口的数组。 对于本教程,我们使用提供的Arr...原创 2018-10-14 15:33:22 · 1033 阅读 · 0 评论 -
如何用OpenMesh创建自己的程序
要成功将自己的应用程序添加到构建树,需要执行以下步骤:转到OpenMeshRoot / src / OpenMesh / Apps并创建一个新目录,比如说“MyOwnProject” 现在创建一个名为“CMakeLists.txt”的新文件,其中包含以下行: 创建源文件,并将它们保存在同一目录中。 添加add_subdirectory (MyOwnProject)到OpenMeshRoo...原创 2018-10-14 15:11:57 · 666 阅读 · 0 评论 -
vs2015利用安装包配置openmesh
下载并安装openmesh根据自己电脑的型号与操作系统的位数选择合适的安装包。 openmesh的下载地址为:https://www.openmesh.org/ 新建一个win32位的项目测试代码/* ========================================================================= ** ...原创 2018-10-12 09:28:02 · 404 阅读 · 0 评论 -
OpenMesh的功能和目标
底层数据结构的主要特征:对三角形网格没有限制,处理一般的多边形网格。 顶点,半边,边和面的显式表示。 有效访问顶点的单环邻域。 能够处理非流形顶点(例如两个面仅在一个顶点相交)。C ++实现的目标/特性是:灵活性:为标量和坐标选择合适的类型(例如浮点数,双精度算法和精确算术点和两维,三维或n维点)。 通过您自己的属性/属性增强每个项目类型,例如 将法线向量或FaceHandle...原创 2018-10-14 09:19:23 · 3960 阅读 · 0 评论 -
半边数据结构
该项目中使用的数据结构是所谓的半边数据结构。 虽然基于面的结构将其连接存储在引用其顶点和邻居的面中,但基于边缘的结构将连接信息放入边缘。 每条边引用其两个顶点,即它所属的面和这些面中的两个下一条边。 如果现在分割边缘(即,连接顶点A和顶点B的边缘变为从A到B的两个定向halfeges,反之亦然),则获得基于半边缘的数据结构。 下图说明了此结构中存储连接的方式:在项目之间具有这些链接,现在可...原创 2018-10-14 09:31:46 · 975 阅读 · 0 评论 -
网状迭代器和循环器
迭代器网格提供线性迭代器(枚举顶点,半边,边和面)。 这些可用于轻松浏览网格。 每个迭代器XYZIter也存在于const版本的ConstXYZIter中。 所有迭代器都在命名空间OpenMesh :: Iterators中定义。 它们是模板类,期望完全指定网格作为模板参数。 您应该使用网格本身提供的迭代器类型,即MyMesh :: VertexIter而不是OpenMesh :: Iter...原创 2018-10-14 10:20:03 · 327 阅读 · 0 评论 -
如何在网格上导航
在半边上导航假设我们有以下网状拓扑: 我们现在可以选择此网格的任意半边,然后提供两种可能的导航之一:如果所选择的半边位于边界或换句话说不是与面相邻,我们现在可以使用next_halfedge_handle()或prev_halfedge_handle()沿着网格的边界(或洞)导航: 如果所选择的半边与面相邻,则我们可以沿着与该面相邻的所有半边导航。 换句话说,我们围绕着一张面的内半部...原创 2018-10-14 10:44:18 · 565 阅读 · 0 评论 -
从文件中读写网格
进行读写相应的函数在命名空间OpenMesh :: MeshIO中定义。 本节分为三个步骤:第一步将给出一个如何使用OpenMesh IOManager的简短示例。 第二步将提供有关IOManager如何工作的一些背景信息。 最后第三步将向您展示如何将自己的模块添加到IOManager。IOManager的快速入门如果静态链接到OpenMesh,则必须将定义OM_STATIC_BUI...原创 2018-10-14 11:22:42 · 632 阅读 · 0 评论 -
翻转和折叠边缘
三角形网格中边缘的翻转以及通过连接两个相邻顶点来折叠边缘。翻转边考虑到三角形网格的两个相邻面,内边缘恰好存在两种不同的配置。 调用OpenMesh :: TriConnectivity :: flip(EdgeHandle _eh)函数会将指定的边缘翻转到相反的方向,如下图所示。具体的应用示例:// Add some verticesTriMesh::VertexHand...原创 2018-10-14 11:36:21 · 943 阅读 · 0 评论 -
概念类层次结构
整体框图大多数继承关系都是通过模板参数化实现的! 这张照片显示了整体概念。构建内核BaseKernel定义了添加/删除/访问等属性的基本操作。 AttribKernelT添加所有相关方法的标准属性。 ArrayKernelT提供了添加/删除/访问网格项顶点,(半)边和面的方法。 基类作为模板参数传递,因为根据底层存储类型,AttribKernel可能会更改。构建网格Pol...原创 2018-10-14 14:12:06 · 982 阅读 · 0 评论 -
构建自定义的网格
有一些参数需要为网格指定。 这是通过以下四个步骤完成的:选择三角形网格和一般多边形网格。 选择网格内核 通过所谓的Traits类对网格进行参数化。 您可以向网格项添加任意类,指定标量,点,正常和颜色类型,并使用预定义属性,如Attributes :: Normal和Attributes :: Color。 使用自定义属性将数据动态绑定到网格或网格实体(顶点,(半)边,面)。多边形网格与...原创 2018-10-14 14:55:54 · 713 阅读 · 0 评论 -
opengl+openmesh重绘rabbit
参考网址:https://blog.youkuaiyun.com/chaojiwudixiaofeixia/article/details/50498629 https://blog.youkuaiyun.com/qq_28057541/article/details/51362945本次实验的对象是斯坦福大学著名的bunny模型(兔子模型)。本文主要介绍了如何如下两点:使用...原创 2018-10-16 12:34:55 · 1331 阅读 · 1 评论