使用Assimp和OpenMesh进行网格简化

时间:2016-12-04 17:29:44

标签: algorithm computational-geometry mesh assimp openmesh

几天前,我问了一个关于如何使用edge collapse with Assimp的问题。平滑obj并删除软件中重复的顶点是解决了可能使边缘折叠工作的基本问题,我的意思是它起作用,因为它可以被MeshLab简化为: simplified mesh

它在MeshLab中看起来不错,但我在我的引擎中使用Assimp和OpenMesh。问题是 Assimp导入了指定的顶点和指数,这可能让半边错过了相反的对(这是否称为非流形?)。 结果快照使用OpenMesh的Quadric Decimation:

Decimation by OpenMesh

要清除以找到问题,我会在没有抽取的情况下执行此操作并直接解析OpenMesh数据结构。一切都按预期工作正常(我的意思是没有抽取的结果)。

Without Decimation

我用来抽取网格的代码:

core.umd.js:2838 EXCEPTION: Uncaught (in promise): Error: Error in http://localhost/app/login/login.component.html:13:46 caused by: Cannot read property 'form' of undefined
TypeError: Cannot read property 'form' of undefined
at CompiledTemplate.proxyViewClass.View_LoginComponent0.detectChangesInternal (/AppModule/LoginComponent/component.ngfactory.js:177:42)
at CompiledTemplate.proxyViewClass.AppView.detectChanges (http://localhost/node_modules/@angular/core/bundles/core.umd.js:9355:18)
at CompiledTemplate.proxyViewClass.DebugAppView.detectChanges (http://localhost/node_modules/@angular/core/bundles/core.umd.js:9448:48)
at CompiledTemplate.proxyViewClass.View_LoginComponent_Host0.detectChangesInternal (/AppModule/LoginComponent/host.ngfactory.js:29:19)
at CompiledTemplate.proxyViewClass.AppView.detectChanges (http://localhost/node_modules/@angular/core/bundles/core.umd.js:9355:18)
at CompiledTemplate.proxyViewClass.DebugAppView.detectChanges (http://localhost/node_modules/@angular/core/bundles/core.umd.js:9448:48)
at ViewRef_.detectChanges (http://localhost/node_modules/@angular/core/bundles/core.umd.js:7338:24)
at RouterOutlet.activate (http://localhost/node_modules/@angular/router/bundles/router.umd.js:3747:46)
at ActivateRoutes.placeComponentIntoOutlet (http://localhost/node_modules/@angular/router/bundles/router.umd.js:3224:20)
at ActivateRoutes.activateRoutes (http://localhost/node_modules/@angular/router/bundles/router.umd.js:3198:26)

同时提供我测试过的the tree obj,以及我从Visual Studio调试器中获取的Assimp生成的the face data,它显示了一些索引无法找到索引对的问题。

1 个答案:

答案 0 :(得分:0)

几个星期以来一直在思考这个并且失败了,我想我想要一些学术/数学解决方案来自动生成这些抽取的网格,但现在我试图找到简单的方法实现这一点,我能够做的就是改变在单个自定义对象(类obj)中加载多对象(file.obj)的结构,并在以下时切换对象需要它。这样做的好处是我可以管理应该存在的内容并忽略任何算法问题。

顺便说一下,我列出了一些让我回归简单的障碍。

  1. Assimp Unique Indices和Vertices,这没什么不对,但对于算法,没办法为此做出邻接半边结构。
  2. OpenMesh只读取目标文件(* .obj),这可以在使用read_mesh函数时完成,但缺点是缺少文档示例,难以在我的引擎中使用。
  3. 为任何格式编写自定义3D模型导入程序都很难。
  4. 总之,有两种方法可以使细节层次在引擎中起作用,一种是使用网格简化算法,更多的是测试以确保质量,另一种只是切换由3d软件制作的3dmodel,它不是自动的但稳定。我使用第二种方法,我在这里显示结果:)

    this work!

    然而,这不是我的问题的真正解决方案,所以我不会给我一个答案。