1

我能够在 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 源代码。这是我尝试做的事情:

....
#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 函数,我想知道是否有人对我有任何指导。

4

1 回答 1

1

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

  • 首先,包含颜色的 OFF 文件应该由COFF而不是OFF. 否则,读者会感到困惑,并且会误解文件中包含的颜色信息。这应该是您复杂的顶点错误的原因。
  • 其次,不需要指定颜色分量的数量。实际上,读者会将此值与三个 RGB 值一起解释为 RGBA 颜色。因此颜色将无法正确显示,因为用于颜色分量数量的列被解释为 R 分量。
于 2020-02-01T17:46:40.107 回答