在网格实验室中为网格边缘着色

问题描述 投票:0回答:3

我一直在研究一种算法,该算法采用网格,用它做一些奇特的事情,并产生一些输出。

为了可视化结果,我决定生成网格的副本,以某种与生成的输出相关的智能方式对其进行着色,并使用 Meshlab 对其进行可视化。但是,我需要对网格边缘的一些进行不同于其他边缘的着色。

在谷歌搜索了几个小时后,我一直无法找到一种方法来做到这一点,尽管文件格式(.obj,.ply ...)似乎支持这种行为,正如建议的那样 本教程(我按照它来生成输出网格)。

我已经制作了一个解决方法,即为每个顶点分配与其相邻的一条边的颜色,然后我只根据顶点颜色为边着色,但不幸的是,这意味着(例如)两种不同颜色的边缘将使用从一种颜色到另一种颜色的渐变进行渲染,这不是预期的行为。

我在这里做错了什么吗? (就像忽略一些明显显而易见的选项)。或者,是否有另一种渲染网格的方法,允许对边缘进行着色(这并不意味着编写自己的渲染器或花费 3 天的时间通过搅拌机手册寻找正确的组合键)?

非常欢迎任何帮助。预先感谢。

3d mesh meshlab
3个回答
7
投票

我想出了一个技巧,基本上可以让我完成工作。

这里:采用原始网格,为每条边创建一个新点,该点恰好是该边的中点。将两个边顶点连接到该中点以形成零面积简并三角形。添加这个三角形,并将该点添加到网格文件中。您猜对了,用边缘颜色为这个新顶点着色。

一旦你调整了网格实验室的背景颜色设置,你将能够很好地看到边缘彩色网格。

(我仍在尝试找出的一件事是如何增加线条的粗细,使其看起来更清晰。现在,您可以转到顶点视图,并看到新点都与边缘一起很好地照亮颜色)


4
投票

正如OP提到的,MeshLab可以使用自定义用户选择的颜色(所有边的颜色相同)或顶点/面颜色(连接到不同颜色的顶点的边将具有渐变颜色)来对边进行着色。可以通过启用

Wireframe
渲染并从选项中选择边缘颜色来完成。


但是,MeshLab 不支持渲染具有特定边缘颜色属性的边缘。我可能是错的,但流行的简单网格格式,如

obj
off
没有存储边缘属性(颜色、厚度等)的规定。我的印象是
ply
也不支持这一点,但OP提供的链接另有说明。

我能想到的唯一解决方案是编写 OpenGL 渲染器来绘制直线而不是三角形。在编写网格时,为每条边写入顶点并为其分配边颜色,即,如果有 3 条边连接到一个顶点,则该顶点将重复三次。


0
投票

@jason 的解决方案,但随后为使用 open3d 的人提供了代码。

`

mesh = o3d.io.read_triangle_mesh(str(mesh_name))

current_points = np.asarray(mesh.vertices)
current_triangles = np.asarray(mesh.triangles)
current_vertex_colors = np.asarray(mesh.vertex_colors)
# current_vertex_normals = np.asarray(mesh.vertex_normals)
counter = len(mesh.vertices)
for i,x in tqdm.tqdm(enumerate(current_triangles)):
    if len(np.unique(current_vertex_colors[x, :],axis=0))==1:
        continue
  
    edge1 = current_points[x, :][:2].mean(axis=0)
    edge2 = current_points[x, :][1:].mean(axis=0)
    edge3 = current_points[x, :][0::2].mean(axis=0)

    colour, count = np.unique(current_vertex_colors[x,:], axis=0, return_counts=True)
    new_colours1 = colour[count.argmax()]

    current_points = np.vstack([current_points, np.array([edge1, edge2, edge3])])
    current_vertex_colors = np.vstack([current_vertex_colors, np.array([new_colours1, new_colours1, new_colours1])])

    # current_vertex_normals = np.vstack([current_vertex_normals, current_vertex_normals[x,:]])

    current_triangles[i,:] = [counter, counter+1, counter+2]

mesh.vertices = o3d.utility.Vector3dVector(current_points)
mesh.triangles = o3d.utility.Vector3iVector(current_triangles)
mesh.vertex_colors = o3d.utility.Vector3dVector(current_vertex_colors)

`

© www.soinside.com 2019 - 2024. All rights reserved.