如何正确使用选项和标志来改变OpenMesh中的read_mesh和write_mesh函数?

时间:2017-09-12 23:47:34

标签: c++ openmesh

我能够在OpenMesh中读取和写入非常基本的.off文件,但是当我使用程序Geomview来可视化网格时,这不能让我看到连接三角网格顶点的边缘。我想出了如何更改.off文件以使用以下格式为我的三角形着色:http://www.geomview.org/docs/html/OFF.html,并且Geomview接受我编写这些文件的方式。但是我似乎无法改变OpenMesh的read_mesh函数,因此它将正确读取所有三角形面。

我尝试使用https://www.openmesh.org/media/Documentations/OpenMesh-Doc-Latest/a00212.html中的OpenMesh :: IO :: Options类以及我从Options.hh源代码中读取的内容来更改read_mesh和write_mesh函数。这是我尝试做的事情:

....
#include <OpenMesh/Core/IO/Options.hh>
....
int main () {

    MyMesh mesh;
    ...
    OpenMesh::IO::Options ops(OpenMesh::IO::Options::FaceColor);
    ops += OpenMesh::IO::Options::ColorFloat;

    std::cout << ops.color_is_float() << std::endl; //returns true
    std::cout << ops.face_has_color() << std::endl; //returns true

    if (!OpenMesh::IO::read_mesh(mesh, argv[2], ops, true)) {
        //when run, it does not enter this if statement
        std::cerr << "Error: cannot read mesh from << argv[2] << std::endl;
    }

    //stuff done to mesh

    std::streamsize str = 5;
    if (!OpenMesh::IO::write_mesh(mesh, argv[3], ops, str) {
        //again, it does not enter this if statement
        std::cerr << "Error ..." << std::endl;
    }

我能够编译程序而没有任何错误,并且它运行。但是,read_mesh函数无法正确读取.off文件。

这是我的.off文件的简单版本:

OFF
30 40 0
0 0 0
0 1 0
0 2 0
... more vertices

然后我有两种写三角形面的方法:

方法1)

#_of_vertices v0 v1 v2 RGB[0] RGB[1] RGB[2]
3 0 1 6 1.0 0.0 0.0
... more faces

方法2)

#_of_vertices v0 v1 v2 #_of_color_components RGB[0] RGB[1] RGB[2]
3 0 1 6 3 1.0 0.0 0.0
.. more faces

对于方法1,read_mesh仅读取第一个三角形面。它命中三角形颜色的浮点值,我假设不知道如何处理它们,所以它只是停止读取值。因为当它将网格写入单独的文件时,它只列出一个面,并且它更新了该特定三面的三个顶点的位置。

对于方法2,我得到了一堆“PolyMeshT :: add_face:complex vertex”错误。

我当然没有正确调整read_mesh功能,我想知道是否有人对我有任何指导。

1 个答案:

答案 0 :(得分:0)

我知道这个问题已经很老了,但是以防万一有人搜索答案;在您的OFF文件示例中,存在两个主要问题:

  • 首先,应使用COFF而不是OFF引入包含颜色的OFF文件。否则,读者会感到困惑,并且仍然会误解文件中包含的颜色信息。这应该是您复杂的顶点错误的原因。
  • 第二,不需要指定颜色成分的数量。实际上,读者会将这个值与三个RGB值一起解释为RGBA颜色。因此颜色将无法正确显示,因为用于颜色成分数量的列将被解释为R成分。