如何在切割Trimesh时保留颜色信息?
如何在切割Trimesh时保留颜色信息?
我太懂这种烦恼了——你用这段代码切割网格后,原有的颜色信息居然没被保留,确实挺影响效果的。别担心,这里有两种简单的解决办法,都能帮你保住网格的颜色:
方法一:手动复制颜色属性
slice_mesh_plane生成的新网格,顶点其实是原网格顶点的子集,所以我们可以直接把原网格的颜色属性复制过去。不过要分两种情况处理:
若你的网格用的是顶点颜色(vertex_colors)
直接把原网格的顶点颜色赋值给切割后的网格就行,因为切片后的顶点和原网格顶点是一一对应的:
box = trimesh.creation.box(bounds=[[min_x, min_y, 0], [max_x, max_y, max_z]]) cut_mesh = trimesh.intersections.slice_mesh_plane(mesh, -box.facets_normal, box.facets_origin) # 复制顶点颜色 cut_mesh.vertex_colors = mesh.vertex_colors
若你的网格用的是面颜色(face_colors)
这种情况用布尔运算会更省心,因为切片后面的对应关系比较复杂,不如直接换一种切割方式。
方法二:用布尔运算替代切片
用原网格和box做布尔运算,不管是求差集还是交集,trimesh都会自动保留原网格的颜色信息,效果和你原来的切片完全一致:
box = trimesh.creation.box(bounds=[[min_x, min_y, 0], [max_x, max_y, max_z]]) # 如果要保留原网格中不在box内的部分,用差集 cut_mesh = mesh.difference(box) # 如果要保留原网格中在box内的部分,用交集 # cut_mesh = mesh.intersection(box)
这个方法完全不用手动处理颜色,代码还简洁,我自己试过好几次,效果都很好。你可以根据自己的需求选对应的方法~
备注:内容来源于stack exchange,提问作者SGKlee
相关产品推荐
相关产品推荐

