关于loop细分的问题,要怎么办?

在返回点的时候没有问题但在组成面之后再返回时return newmesh那好像就出问题了,这是为什么?要怎么改?
loop细分在只返回点时

MyMesh LoopSubdivision()
{
    MyMesh newmesh;
    map<OpenMesh::HalfedgeHandle,OpenMesh::VertexHandle>mapv1;
    map<OpenMesh::VertexHandle,OpenMesh::VertexHandle>mapv2;
//更新旧顶点放入newmesh中
    for (auto it=mesh.vertices_begin();it!=mesh.vertices_end();++it)
    {
        auto v0=it.handle();
        OpenMesh::VertexHandle v;
        MyMesh::Point a=Update(v0);
        v=newmesh.add_vertex(a);
        mapv2.insert(pair<OpenMesh::VertexHandle,OpenMesh::VertexHandle>(v0,v));
    }
//插入新顶点放入newmesh中
    for (auto it=mesh.halfedges_begin();it!=mesh.halfedges_end();++it)
    {
        auto he1=it.handle();
        auto he2=mesh.opposite_halfedge_handle(he1);
        if (mesh.status(he1).tagged()==false)
        {
            OpenMesh::VertexHandle v;
            MyMesh::Point a=Insert(he1);
            v=newmesh.add_vertex(a);
            mapv1.insert(pair<OpenMesh::HalfedgeHandle,OpenMesh::VertexHandle>(he1,v));
            mapv1.insert(pair<OpenMesh::HalfedgeHandle,OpenMesh::VertexHandle>(he2,v));
        }
    }
    cout<<"---------------"<<endl;
    return newmesh;
}

原本正方体的八个点变成下图的二十六个点

img

组成面之后再返回时

MyMesh LoopSubdivision()
{
    MyMesh newmesh;
    map<OpenMesh::HalfedgeHandle,OpenMesh::VertexHandle>mapv1;
    map<OpenMesh::VertexHandle,OpenMesh::VertexHandle>mapv2;
//更新旧顶点放入newmesh中
    for (auto it=mesh.vertices_begin();it!=mesh.vertices_end();++it)
    {
        auto v0=it.handle();
        OpenMesh::VertexHandle v;
        MyMesh::Point a=Update(v0);
        v=newmesh.add_vertex(a);
        mapv2.insert(pair<OpenMesh::VertexHandle,OpenMesh::VertexHandle>(v0,v));

    }
插入新顶点放入newmesh中
    for (auto it=mesh.halfedges_begin();it!=mesh.halfedges_end();++it)
    {
        auto he1=it.handle();
        auto he2=mesh.opposite_halfedge_handle(he1);
        if (mesh.status(he1).tagged()==false)
        {
            OpenMesh::VertexHandle v;
            MyMesh::Point a=Insert(he1);
            v=newmesh.add_vertex(a);
            mapv1.insert(pair<OpenMesh::HalfedgeHandle,OpenMesh::VertexHandle>(he1,v));
            mapv1.insert(pair<OpenMesh::HalfedgeHandle,OpenMesh::VertexHandle>(he2,v));
        }
    }
//根据对应关系找到在mesh中的每个旧面的在更新、插入顶点后在newmesh中对应的六个点存入vh1中
    vector<vector<OpenMesh::VertexHandle>> vh1;
    for (auto it=mesh.faces_begin();it!=mesh.faces_end();++it)
    {
        vector<OpenMesh::VertexHandle> vh2;
        auto he1=mesh.fh_begin(it.handle());
        auto he2=mesh.next_halfedge_handle(he1);
        auto he3=mesh.next_halfedge_handle(he2);
        auto v1=mesh.from_vertex_handle(he1);
        auto v2=mesh.from_vertex_handle(he2);
        auto v3=mesh.from_vertex_handle(he3);
        OpenMesh::VertexHandle v4,v5,v6,v11,v22,v33;
        map<OpenMesh::HalfedgeHandle,OpenMesh::VertexHandle>::iterator iter1;
        iter1=mapv1.find(he1);
        v4=iter1->second;
        vh2.push_back(v4);
        iter1=mapv1.find(he2);
        v5=iter1->second;
        vh2.push_back(v5);
        iter1=mapv1.find(he3);
        v6=iter1->second;
        vh2.push_back(v6);
        map<OpenMesh::VertexHandle,OpenMesh::VertexHandle>::iterator iter2;
        iter2=mapv2.find(v1);
        v11=iter2->second;
        vh2.push_back(v11);
        iter2=mapv2.find(v2);
        v22=iter2->second;
        vh2.push_back(v22);
        iter2=mapv2.find(v3);
        v33=iter2->second;
        vh2.push_back(v33);
        vh1.push_back(vh2);
    }
//将newmesh中的点组成面
    for (int i=0;i<vh1.size();i++)
    {
        std::vector<MyMesh::VertexHandle>face_vhandles;
        face_vhandles.clear();
        face_vhandles.push_back(vh1[i][0]);
        face_vhandles.push_back(vh1[i][1]);
        face_vhandles.push_back(vh1[i][2]);
        newmesh.add_face(face_vhandles);
        face_vhandles.clear();
        face_vhandles.push_back(vh1[i][0]);
        face_vhandles.push_back(vh1[i][4]);
        face_vhandles.push_back(vh1[i][1]);
        newmesh.add_face(face_vhandles);
        face_vhandles.clear();
        face_vhandles.push_back(vh1[i][1]);
        face_vhandles.push_back(vh1[i][5]);
        face_vhandles.push_back(vh1[i][2]);
        newmesh.add_face(face_vhandles);
        face_vhandles.clear();
        face_vhandles.push_back(vh1[i][2]);
        face_vhandles.push_back(vh1[i][3]);
        face_vhandles.push_back(vh1[i][0]);
        newmesh.add_face(face_vhandles);
    }
    cout<<"---------------"<<endl;
    return newmesh;
}

显示就变成这样了

img

这是为什么?要怎么改?

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。