在返回点的时候没有问题但在组成面之后再返回时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;
}
原本正方体的八个点变成下图的二十六个点
组成面之后再返回时
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;
}
显示就变成这样了
这是为什么?要怎么改?
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。