如何在Python MeshLib库中合并两个网格并让地面网格处于墙体网格下方
如何在Python MeshLib库中合并两个网格并让地面网格处于墙体网格下方
看起来你遇到的问题是合并后地面网格跑到墙体网格上方了,这大概率是因为两个网格的Z轴位置没有调整到位。我们可以通过手动平移其中一个网格的所有顶点,或者调整addBaseToPlanarMesh的参数来确保地面在墙体下方。
问题分析
你当前的代码中,给墙体(mesh)设置了zOffset=150的底座,给地面(mesh1)设置了zOffset=10的底座,但合并后层级不符合预期。这可能是因为addBaseToPlanarMesh的Z轴方向和你预期的相反,或者两个网格的整体Z轴范围有重叠导致显示顺序异常。
解决方案:调整网格Z轴位置
最直接有效的方法是确保地面网格的所有顶点Z坐标都小于墙体网格的顶点Z坐标,这里提供两种实现方式:
方式1:手动平移网格顶点
在合并前,通过mr.transformMesh给地面网格添加一个Z轴方向的平移,让它整体下移到墙体下方:
from PIL import Image import meshlib.mrmeshpy as mr # Load and prepare raster images Image.open('walls_mask.png').convert('RGBA').save('walls_mask.png') Image.open('ground.png').convert('RGBA').save('ground.png') # Load distance maps from images dm = mr.loadDistanceMapFromImage("walls_mask.png", 0) dm1 = mr.loadDistanceMapFromImage("ground.png", 0) # Find the boundary contours between black and white polyline2 = mr.distanceMapTo2DIsoPolyline(dm, isoValue=127) polyline21 = mr.distanceMapTo2DIsoPolyline(dm1, isoValue=127) # Triangulate the contours mesh = mr.triangulateContours(polyline2.contours2(mr.HolesVertIds())) mesh1 = mr.triangulateContours(polyline21.contours2(mr.HolesVertIds())) # Subdivide the meshes to add detail mr.subdivideMesh(mesh) mr.subdivideMesh(mesh1) # Add bases to the planar meshes mr.addBaseToPlanarMesh(mesh, zOffset=150) mr.addBaseToPlanarMesh(mesh1, zOffset=10) # 关键修改:平移地面网格,让它整体下移到墙体下方 # 创建Z轴负方向的平移变换,偏移量可根据模型大小调整 z_translate = mr.AffineXf3f.translation(mr.Vector3f(0, 0, -200)) mr.transformMesh(mesh1, z_translate) # Merge the two meshes(顺序不影响,只要Z位置正确) merged_mesh = mr.mergeMeshes([mesh1, mesh]) # Save the merged mesh as an OBJ or STL file mr.saveMesh(merged_mesh, mr.Path("Merged_mesh.stl"))
方式2:调整addBaseToPlanarMesh的zOffset参数
直接修改底座的偏移量,让墙体的底座更高(整体位置更靠上),地面的底座更低(整体位置更靠下):
# 替换原有的addBaseToPlanarMesh代码 mr.addBaseToPlanarMesh(mesh, zOffset=200) # 墙体底座高度增加,整体上移 mr.addBaseToPlanarMesh(mesh1, zOffset=-50) # 地面底座向下延伸,整体下移
关键说明
- 平移变换的作用:
mr.AffineXf3f.translation用于创建三维平移变换,我们只需要调整Z轴的偏移量,确保地面网格的所有顶点Z值都小于墙体的Z值即可。 - 合并顺序不影响:只要两个网格的Z轴位置正确,合并时的顺序
[mesh1, mesh]或[mesh, mesh1]都不会影响最终的层级显示。 - 参数调整建议:你可以根据模型的实际大小,灵活调整平移偏移量或
zOffset的数值,直到层级关系符合预期。
备注:内容来源于stack exchange,提问作者Shahroz Atiq
相关产品推荐
相关产品推荐

