【问题标题】:Openmesh: How to modify mesh faces? (And how to random access component handles?)Openmesh:如何修改网格面? (以及如何随机访问组件句柄?)
【发布时间】:2017-10-30 02:33:52
【问题描述】:

我刚开始在 Python 中使用 OpenMesh。我首先尝试制作一个由单个四边形组成的 PolyMesh。这就是我所做的:

from openmesh import *
mesh = PolyMesh();
vh0 = mesh.add_vertex(PolyMesh.Point(0,0,0));
vh1 = mesh.add_vertex(PolyMesh.Point(1,0,0));
vh2 = mesh.add_vertex(PolyMesh.Point(1,1,0));
vh3 = mesh.add_vertex(PolyMesh.Point(0,1,0));
vh_list = [vh0, vh1, vh2, vh3];
fh0 = mesh.add_face(vh_list);

这将创建一个四边形网格。然后,想把四边形细化一次,我想试试:

vh4 = mesh.add_vertex(PolyMesh.Point(0.5,0,0));
vh5 = mesh.add_vertex(PolyMesh.Point(0.5,1,0));
vh_list = [vh4, vh1, vh2, vh5];
fh1 = mesh.add_face(vh_list);

上面给了我一个complex edge 错误。我从关于 SO 的其他问题中了解到,这是因为第二种情况下的 vh_list 没有定义第一面的一致方向。但是,我不想添加新面孔。也就是说,我认为该操作只会在 x = 0.5 处拆分 fh0,而不是在边缘索引 1 处创建附加到 fh0 的新面。有人可以谈谈如何做到这一点吗?我在文档中找不到“split_face”函数。

另外,如何在 Python 中访问特定边/网格组件的句柄? (我只找到了 C++ 的答案。)例如,我知道我可以迭代边缘,

for eh in mesh.edges():

但是我怎样才能直接获取边缘 2 的句柄并使用它,例如?

mesh.split_edge(eh,vh5)

谢谢!

编辑 1

我在 OpenMesh 文档中找到了函数 split,但它需要一个顶点句柄作为输入,我可以在该顶点句柄处分割面。在拆分后,它将网格转换为三角形网格。我不想要这个。我想在 x = 0.5 处将四边形分成两个四边形。谢谢。

编辑 2

我尝试了另一种方法:首先删除 fh0,然后根据我想要的细化添加两个新面 fh0 和 fh1。我试过做

mesh.delete_face(fh0)

Python 出现段错误并退出。

【问题讨论】:

    标签: python openmesh


    【解决方案1】:

    如果要将面 fh0 拆分为两个面,则应先删除 fh0,然后再创建两个新面。这应该可以完成工作:

    mesh.delete_face(fh0, deleted_isolated_vertices = False)
    mesh.garbage_collection()
    
    fh0 = mesh.add_face(vh0,vh4,vh5,vh3)
    fh1 = mesh.add_face(vh4,vh1,vh2,vh5)
    

    为了验证你得到了你想要的,请求print(mesh.face_vertex_indices()),你应该得到两个列表,列出每个面的顶点索引。

    此外,要访问已知的边缘句柄,您可以使用

    eh = mesh.edge_handle(edge_index)
    

    其中edge_indexint,您感兴趣的边缘的索引。

    希望对你有帮助,

    查尔斯。

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 2012-12-30
      • 1970-01-01
      • 2014-01-04
      • 2014-10-30
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多