源码分析学习记录(2)——网格无缝缝合

本文介绍了Dust3D的无缝建模技术,通过recombine()函数和adjustTrianglesFromSeam()函数实现网格自动缝合。在recombine()中,通过建立face map和检查缝隙来分离并连接顶点;adjustTrianglesFromSeam()则用于缝合后的重复信息调整,确保网格正确。
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值