EyeShot中合并网格后无法闭合,无法生成有效实体的技术问询
在EyeShot中合并网格生成闭合实体的解决方案
你当前的代码仅生成了两个独立的平面网格,合并后缺少连接平面的侧边面,因此无法形成闭合体,转换实体时只能得到分离的平面。原代码如下:
List<Point3D> lpoint3D = new List<Point3D>(); lpoint3D.Add(new Point3D(0, 0, 10)); lpoint3D.Add(new Point3D(5,5, 10)); lpoint3D.Add(new Point3D(0, 5, 10)); lpoint3D.Add(new Point3D(5, 0, 10)); VAR_Glob.mesh2 = UtilityEx.Triangulate(lpoint3D); List<Point3D> lpoint3D = new List<Point3D>(); lpoint3D.Add(new Point3D(0, 0, 5)); lpoint3D.Add(new Point3D(5, 5, 5)); lpoint3D.Add(new Point3D(0, 5, 5)); lpoint3D.Add(new Point3D(5, 0, 5)); VAR_Glob.mesh1 = UtilityEx.Triangulate(lpoint3D); VAR_Glob.mesh2.MergeWith(VAR_Glob.mesh1, false, true); // 转换实体失败,得到两个分离平面 Solid s2 = VAR_Glob.mesh2.ConvertToSolid();
核心问题与解决步骤
要生成闭合网格并转换为有效实体,关键是补充连接两个平面的侧边三角面,同时确保网格拓扑和法线方向正确,具体操作如下:
补充侧边三角面
原网格只有上下两个平面的三角面,缺少封闭所需的侧边面。需要手动为上下平面的对应顶点创建连接的三角面,形成完整的棱柱结构。统一法线方向
闭合网格的所有三角面法线方向必须一致(均指向实体外侧或内侧),否则ConvertToSolid方法会失败。可使用Mesh.OrientNormals自动统一法线。清理网格拓扑
合并后调用Mesh.Clean方法,清理重复顶点、边或面,确保网格结构无错误。
修改后的示例代码
// 生成上平面网格 List<Point3D> topPoints = new List<Point3D>(); topPoints.Add(new Point3D(0, 0, 10)); topPoints.Add(new Point3D(5,5, 10)); topPoints.Add(new Point3D(0, 5, 10)); topPoints.Add(new Point3D(5, 0, 10)); Mesh topMesh = UtilityEx.Triangulate(topPoints); // 生成下平面网格 List<Point3D> bottomPoints = new List<Point3D>(); bottomPoints.Add(new Point3D(0, 0, 5)); bottomPoints.Add(new Point3D(5, 5, 5)); bottomPoints.Add(new Point3D(0, 5, 5)); bottomPoints.Add(new Point3D(5, 0, 5)); Mesh bottomMesh = UtilityEx.Triangulate(bottomPoints); // 创建侧边三角面,连接上下平面对应顶点 Mesh sideMesh = new Mesh(); // 侧边1 sideMesh.AddTriangle(topPoints[0], bottomPoints[0], topPoints[2]); sideMesh.AddTriangle(bottomPoints[0], bottomPoints[2], topPoints[2]); // 侧边2 sideMesh.AddTriangle(topPoints[2], bottomPoints[2], topPoints[1]); sideMesh.AddTriangle(bottomPoints[2], bottomPoints[1], topPoints[1]); // 侧边3 sideMesh.AddTriangle(topPoints[1], bottomPoints[1], topPoints[3]); sideMesh.AddTriangle(bottomPoints[1], bottomPoints[3], topPoints[3]); // 侧边4 sideMesh.AddTriangle(topPoints[3], bottomPoints[3], topPoints[0]); sideMesh.AddTriangle(bottomPoints[3], bottomPoints[0], topPoints[0]); // 合并所有网格 topMesh.MergeWith(bottomMesh, false, true); topMesh.MergeWith(sideMesh, false, true); // 统一法线并清理网格 topMesh.OrientNormals(); topMesh.Clean(); // 转换为有效实体 Solid solid = topMesh.ConvertToSolid();
额外建议
- 对于规则形状(如棱柱),直接使用EyeShot的
Solid.CreatePrism等API构造实体,比手动处理网格更高效可靠。 - 进行交集/差集布尔运算时,必须确保参与运算的两个实体均为有效闭合实体,否则运算会失败。
内容的提问来源于stack exchange,提问作者GeometryGuy
相关产品推荐
相关产品推荐

