深拷贝现有的Mesh数据,并考虑Face的删除(D)标记,新构造的Mesh中不含已删除的Face,且去除了未引用的顶点。
// 假设 PolyMesh 定义了你的 TriMesh 类型
void DeepCopyMesh(const PolyMesh& src, PolyMesh& dst)
{
// 清空目标网格
dst.Clear();
// 分配足够的空间
dst.vert.resize(src.vert.size());
// 复制顶点
for (int i = 0; i < src.vert.size(); ++i) {
dst.vert[i].P() = src.vert[i].P(); // P() 是获取位置的方法
// 如果有其他属性,也在此处复制
}
// 复制面
for (int i = 0; i < src.face.size(); ++i) {
if (src.face[i].IsD())
continue;
PolyMesh::FaceIterator fi = vcg::tri::Allocator<PolyMesh>::AddFaces(dst, 1);
fi->Alloc(src.face[i].VN());
for (int j = 0; j < src.face[i].VN(); ++j) {
fi->V(j) = &dst.vert[vcg::tri::Index(src, src.face[i].V(j))];
}
}
dst.vn = dst.vert.size(); // 注意这里要更新一下点的数量,否则后面Rem