给定门+门框的 3D 模型 - 如何检测门并分离网格

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

所以我的问题如下: 我有一扇随机门的one网格(意思是可移动的门和框架)。 我想检测门并将其与门框分开,将两者放在不同的网格上。

有人能把我推向正确的方向吗?我应该从哪里开始。

我正在团结一致地工作,需要分离才能旋转门(而不是框架)。

已经用谷歌搜索了一堆,发现了边缘检测、3D 网格分割等。

我对此类问题完全陌生,不知道从哪里开始。

c# unity-game-engine blender mesh vertices
1个回答
0
投票

典型的解决方案是计算网格的连接信息,例如翼边/半翼边或等效项。重要的是让你有效地找到相邻的三角形。请注意,这些类型的结构通常需要“形状良好”的网格。我还假设网格采用“索引三角形集”格式。

我没有使用过 unity,但似乎有一个 winged edge 包可能有用。使用“下一个”、“相反”和“面”属性查找任何面的三个相邻三角形。

一个简单且内存效率低的选项可能是使用 MultiValueDictionary 创建从顶点到使用该顶点的所有三角形的映射。

一旦获得连接信息,算法就相当简单,本质上是“洪水填充”分段:

对于每个三角形:

  1. 如果三角形缺少分割id:
  2. 增加当前分割id,并将三角形添加到堆栈中
  3. 对于堆栈中的每个三角形。
    1. 用当前分割id标记三角形
    2. 将所有没有分段 id 的相邻三角形添加到堆栈中。

这应该为网格的所有未连接部分提供唯一的分段 ID。您通常会使用单独的数组来跟踪每个三角形的分段 ID。您可以对边或顶点应用相同的原理,并且通过翼边结构使用边可能会更容易。

获得每个三角形的分割 ID 后,用相同的 id 标记三角形的顶点。然后将段的顶点复制到新的顶点列表,同时保留原始索引和新索引之间的映射。然后对三角形执行相同的操作,并使用映射数组来更新每个三角形的顶点索引。

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