You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

核心问题与解决步骤

要生成闭合网格并转换为有效实体,关键是补充连接两个平面的侧边三角面,同时确保网格拓扑和法线方向正确,具体操作如下:

  1. 补充侧边三角面
    原网格只有上下两个平面的三角面,缺少封闭所需的侧边面。需要手动为上下平面的对应顶点创建连接的三角面,形成完整的棱柱结构。

  2. 统一法线方向
    闭合网格的所有三角面法线方向必须一致(均指向实体外侧或内侧),否则ConvertToSolid方法会失败。可使用Mesh.OrientNormals自动统一法线。

  3. 清理网格拓扑
    合并后调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:55:42