【发布时间】:2019-02-06 13:36:23
【问题描述】:
我正在尝试修改CGAL-4.13/examples/Surface_mesh_parameterization/lscm.cpp,以便生成的关闭文件中的顶点顺序与输入文件中的相同。
更新:示例
获取文件input.off,内容如下:
OFF
4 2 0
-0.9310345 0.4333333 0
-1 0.4333333 0
-0.9310345 0.5 0
-1 0.5 0
3 1 0 2
3 2 3 1
当我从 CGAL 调用标准 lscm 时
/path/to/CGAL-4.13-build/examples/Surface_mesh_parameterization/lscm input.off
我得到coords.off包含
OFF
4 2 0
-1 0.5 0
-0.931034 0.5 0
-0.931034 0.433333 0
-1 0.433333 0
3 3 2 1
3 1 0 3
和uvmap.off 一起
OFF
4 2 0
-0.0166567 0.982769 0
1 1 0
1.01666 0.0172311 0
0 0 0
3 3 2 1
3 1 0 3
文件coords.off 和uvmap.off 包含相同顺序的顶点及其参数对(与input.off 中的顺序不同)。相反,我希望uvmap.off 中的参数按照与input.off 对应的顺序排列。特别是,我希望uvmap.off 看起来像这样:
OFF
4 2 0
1.01666 0.0172311 0
0 0 0
1 1 0
-0.0166567 0.982769 0
3 1 0 2
3 2 3 1
基本上,这会使coords.off 变得多余,因为我可以在其角色中使用input.off。
努力解决问题
据我了解,这可以通过使用 6 个参数而不是 4 个参数调用 output_uvmap_to_off(...) 来实现(两个版本都可以在 CGAL-4.13/include/CGAL/Surface_mesh_parameterization/IO/File_off.h 中找到)。由于这些参数之一是VertexIndexMap,我可能也应该使用
CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3< TriangleMesh_, BorderParameterizer_, SolverTraits_ >::parameterize(...)
而不是
CGAL::Surface_mesh_parameterization::parameterize(...)
在示例中使用。
这是一个最小的(不是真正有效的)示例。它源自lscm.cpp,但为了简洁,我扔掉了很多东西。
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/boost/graph/Seam_mesh.h>
#include <CGAL/Surface_mesh_parameterization/IO/File_off.h>
#include <CGAL/Surface_mesh_parameterization/parameterize.h>
#include <CGAL/Surface_mesh_parameterization/Two_vertices_parameterizer_3.h>
#include <CGAL/Surface_mesh_parameterization/LSCM_parameterizer_3.h>
#include <CGAL/Polygon_mesh_processing/measure.h>
#include <boost/foreach.hpp>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Point_3 Point_3;
typedef CGAL::Surface_mesh<Kernel::Point_3> SurfaceMesh;
typedef boost::graph_traits<SurfaceMesh>::edge_descriptor SM_edge_descriptor;
typedef boost::graph_traits<SurfaceMesh>::halfedge_descriptor SM_halfedge_descriptor;
typedef boost::graph_traits<SurfaceMesh>::vertex_descriptor SM_vertex_descriptor;
typedef SurfaceMesh::Property_map<SM_halfedge_descriptor, Point_2> UV_pmap;
typedef SurfaceMesh::Property_map<SM_edge_descriptor, bool> Seam_edge_pmap;
typedef SurfaceMesh::Property_map<SM_vertex_descriptor, bool> Seam_vertex_pmap;
typedef CGAL::Seam_mesh<SurfaceMesh, Seam_edge_pmap, Seam_vertex_pmap> Mesh;
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
typedef boost::graph_traits<Mesh>::halfedge_descriptor halfedge_descriptor;
typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;
namespace SMP = CGAL::Surface_mesh_parameterization;
int main(int argc, char** argv)
{
std::ifstream in_mesh((argc>1) ? argv[1] : "data/lion.off");
if(!in_mesh){
std::cerr << "Error: problem loading the input data" << std::endl;
return EXIT_FAILURE;
}
SurfaceMesh sm;
in_mesh >> sm;
Seam_edge_pmap seam_edge_pm = sm.add_property_map<SM_edge_descriptor, bool>("e:on_seam", false).first;
Seam_vertex_pmap seam_vertex_pm = sm.add_property_map<SM_vertex_descriptor, bool>("v:on_seam", false).first;
Mesh mesh(sm, seam_edge_pm, seam_vertex_pm);
UV_pmap uv_pm = sm.add_property_map<SM_halfedge_descriptor, Point_2>("h:uv").first;
halfedge_descriptor bhd = CGAL::Polygon_mesh_processing::longest_border(mesh, CGAL::Polygon_mesh_processing::parameters::all_default()).first;
typedef SMP::Two_vertices_parameterizer_3<Mesh> Border_parameterizer;
typedef SMP::LSCM_parameterizer_3<Mesh, Border_parameterizer> Parameterizer;
// Here's where the big changes start.
SurfaceMesh::Property_map<SM_halfedge_descriptor, int> vimap = sm.add_property_map<SM_halfedge_descriptor, int>("h:vi").first;
SurfaceMesh::Property_map<SM_halfedge_descriptor, bool> vpmap = sm.add_property_map<SM_halfedge_descriptor, bool>("h:vp").first;
Parameterizer parameterizer;
parameterizer.parameterize(mesh, bhd, uv_pm, vimap, vpmap);
const char* uvmap_file = "uvmap.off";
std::ofstream uvmap_out(uvmap_file);
SMP::IO::output_uvmap_to_off(mesh,sm.vertices(),sm.faces(),uv_pm,vimap,uvmap_out);
return EXIT_SUCCESS;
}
这不会编译,抱怨 File_off.h 的第 131 行需要转换。
实际问题
【问题讨论】:
-
也许我遗漏了一些东西,因为查看正在使用网格(而不是顶点范围)的函数
output_uvmap_to_off()的代码,顶点与网格中的顺序完全相同(给我的文件中的l. 125)。为什么你认为订单没有保留? -
@sloriot 我添加了一个示例来更好地解释我得到什么以及我想得到什么。
-
我能做些什么来提高获得答案的机会吗?我应该更准确地解释一些部分吗?还是只是运气不好,没人知道?
-
看来这个issue应该回答你的问题了。
-
@sloriot 确实如此,非常感谢。我不得不使用
Polyhedron_3而不是Surface_mesh,但这很好。您介意将您的评论变成答案,以便我接受吗?
标签: c++ file-io mesh cgal parameterization