Openmesh:如何修改网格面? (以及如何随机访问组件句柄?)

时间:2017-10-30 02:33:52

标签: python openmesh

我刚开始在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():

但是如何直接获取edge 2的句柄并按如下方式使用它,例如?

mesh.split_edge(eh,vh5)

谢谢!

修改1

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

修改2

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

mesh.delete_face(fh0)

和Python segfaulted and exited。

1 个答案:

答案 0 :(得分: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,是您感兴趣边缘的索引。

希望这有帮助,

查尔斯。