2021SC@SDUSC
Dust3D有一个重要特点是“无缝建模”,当模型间距小于一定值时实现模型间的自动网格缝合,这一过程中涉及到了之前提到的半边结构的相关知识。
recombine()
首先为半边建立face map,然后找到存在缝隙的位置:
遍历每一个面,对于索引为index的面读取其顶点索引序列,若当前节点的第一个节点值为空,则检查下一个邻接面,第一个节点值也为空时,记录在当前位置存在缝隙。
std::map<size_t, std::vector<size_t>> seamLink;
for (const auto &face: *m_faces) {
for (size_t i = 0; i < face.size(); ++i) {
const auto &index = face[i];
auto source = (*m_verticesSourceIndices)[index]; //面的顶点索引序列
if (MeshCombiner::Source::None == source.first) {
//若第一个节点值为None,则对下一个邻接面进行检查
auto next = face[(i + 1) % face.size()];
auto nextSource = (*m_verticesSourceIndices)[next];
if (MeshCombiner::Source::None == nextSource.first) {
//记录index和next间存在缝隙
seamLink[index].push_back(next);
}
}
}
}
将缝隙处的顶点一个一个分隔开作为独立个体,对m_faces的每个面进行:读取其顶点索引序列,若序列顶点的第一个节点为空,在islandmap中寻找对应顶点,如果它不是map的尾结点,则说明该islandmap包含缝隙处的顶点,在m_faces所在区域增加该面和相该island的连接,并重新生成边。
std::map<size_t, size_t> seamVertexToIslandMap;
//将缝隙处的顶点分隔开作为独立个体
size_t islands = splitSeamVerticesToIslands(seamLink, &seamVertexToIslandMap