c++ - addface::OpenMesh 中的复杂边错误

标签 c++ openmesh

我一直在关注 OpenMesh 教程 First Steps - Building a Cube通过一些修改,我使用了 TriMesh 而不是 PolyMesh,并且正在构建金字塔而不是立方体。

不知何故,我的第二个和第三个面出现错误 PolymeshT::add_face:complex edge。这些面应位于点 (0,0,0)、(0,1,0) 和 (0,0,1) 与点 (0,0,0)、(0,0,1) 和(1,0,0)。

当每个面从 (0,0,0) 到 (0,1,0) 和 (0,0,0) 到 (0,0,1) 构造时,两条边已经存在,但我应该能够在一些边已经存在的地方创建面,我不应该吗?

到目前为止我尝试过的解决方案

  • 改变坐标
  • 使用 PolyMesh 代替 TriMesh

我无法发现我所做的任何与教程不同的事情。

#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
typedef OpenMesh::TriMesh_ArrayKernelT<> MyTriMesh;

// Make a pyramid
int main()
{
    MyTriMesh tin;

    // generate vertices
    MyTriMesh::VertexHandle vhandle[4];
    vhandle[0] = tin.add_vertex(MyTriMesh::Point(0, 0, 0));
    vhandle[1] = tin.add_vertex(MyTriMesh::Point(0, 1, 0));
    vhandle[2] = tin.add_vertex(MyTriMesh::Point(1, 0, 0));
    vhandle[3] = tin.add_vertex(MyTriMesh::Point(0, 0, 1));

    // generate (trianglar) faces
    std::vector<MyTriMesh::VertexHandle> face_vhandles;
    face_vhandles.clear();
    face_vhandles.push_back(vhandle[0]);
    face_vhandles.push_back(vhandle[1]);
    face_vhandles.push_back(vhandle[2]);
    tin.add_face(face_vhandles);

    printf("Vertices: %u\nEdges: %u\nTriangles: %u\n",
        tin.n_vertices(), tin.n_edges(), tin.n_faces());

    face_vhandles.clear();
    face_vhandles.push_back(vhandle[0]);
    face_vhandles.push_back(vhandle[1]);
    face_vhandles.push_back(vhandle[3]);
    tin.add_face(face_vhandles);

    printf("Vertices: %u\nEdges: %u\nTriangles: %u\n",
        tin.n_vertices(), tin.n_edges(), tin.n_faces());

    face_vhandles.clear();
    face_vhandles.push_back(vhandle[0]);
    face_vhandles.push_back(vhandle[3]);
    face_vhandles.push_back(vhandle[2]);
    tin.add_face(face_vhandles);

    printf("Vertices: %u\nEdges: %u\nTriangles: %u\n",
        tin.n_vertices(), tin.n_edges(), tin.n_faces());

    face_vhandles.clear();
    face_vhandles.push_back(vhandle[1]);
    face_vhandles.push_back(vhandle[3]);
    face_vhandles.push_back(vhandle[2]);
    tin.add_face(face_vhandles);

    printf("Vertices: %u\nEdges: %u\nTriangles: %u\n",
        tin.n_vertices(), tin.n_edges(), tin.n_faces());

}

最佳答案

此错误是由于某些面的顶点以错误的顺序添加所致。

OpenMesh 使用 halfedge structure用于描述网格的 3d 结构。半边是顶点之间的方向边。这允许通过跟随属于该面的半边来横切面上的顶点。然而,由于这个原因,将顶点添加到面的顺序非常重要。

通常,顶点应始终按逆时针顺序添加。这导致相邻面的半边指向相反的方向,如左下图所示。如果顶点的顺序不一致,则对于哪条边跟随半边、“A”的底边或“B”的底边存在歧义,如右下图所示。

Illustration of directed halfedges

在问题的代码中,面 1 和 4 逆时针排列,面 2 和 3 顺时针排列。简单的解决方法是切换这两个面的第一个和第三个顶点。

face_vhandles.clear();
face_vhandles.push_back(vhandle[3]);
face_vhandles.push_back(vhandle[1]);
face_vhandles.push_back(vhandle[0]);
tin.add_face(face_vhandles);

face_vhandles.clear();
face_vhandles.push_back(vhandle[2]);
face_vhandles.push_back(vhandle[3]);
face_vhandles.push_back(vhandle[0]);
tin.add_face(face_vhandles);

关于c++ - addface::OpenMesh 中的复杂边错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24205196/

相关文章:

c++ - 返回 vector 内对象的引用

c++ - 定义用于 volatile 和非 volatile 对象的例程

algorithm - 使用 Assimp 和 OpenMesh 简化网格

mesh - OpenMesh 随机接入

c++ - 读取 OpenMesh 文件时断言 block_size == b 失败

c++ - 如何在按下 "stop"按钮时捕获 clion 中捆绑的 GDB 发出的信号?

c++ - 使用 C++ 在 Linux 中绘图并创建位图

openmesh - 添加元素时 OpenMesh 迭代器是否会更改?

c++ - 如何在 Eclipse 中找到特定 header 的包含路由?