我正在努力在LS 2017上使用LSCM和最新的CGAL在仅标头模式下在Windows上使用VS 2017在封闭的三角形网格上生成UV坐标。我拥有的代码非常简单,因为我实际上不能拥有两个固定了接缝的顶点,所以我依赖于SMP::Two_vertices_parameterizer_3
的默认构造函数。
typedef CGAL::Simple_cartesian<double> Kerneld;
typedef Kerneld::Point_3 Pointd;
typedef CGAL::Surface_mesh<Pointd> Meshd;
// ...
if (parameterizeMesh)
{
std::cout << "Parameterizing mesh with Least-Squares Conformal Mapping ... " << std::endl;
Meshd meshd;
PMP::polygon_soup_to_polygon_mesh(vd, polys, meshd);
SMP::LSCM_parameterizer_3<Meshd, SMP::Two_vertices_parameterizer_3<Meshd>> param;
Meshd::Property_map<Meshd::Vertex_index, Kerneld::Point_2> uvmap = meshd.add_property_map<Meshd::vertex_index, Kerneld::Point_2>("v:uv").first;
SMP::parameterize(meshd, param, PMP::longest_border(meshd).first, uvmap);
}
并且失败了:
CGAL error: assertion violation!
Expression : _idx < data_.size()
File : C:\dev\CGAL-4.14\include\CGAL/Surface_mesh/Properties.h
Line : 206
Explanation:
Refer to the bug-reporting instructions at https://www.cgal.org/bug_report.html
然后我在断言违规之前打印_idx
和data_.size()
的值,并得到了4294967294
(即2^32 - 2
)和{{1}的有趣结果。 } 分别。值得注意的是,所讨论的网格具有16376个三角形面,而16376 * 3 = 49128。我读了许多有关平面参数化的CGAL示例,但无济于事。
EDIT:经过进一步检查,似乎最大的数字实际上是49128
返回的数字,这很有意义,因为我使用的是封闭网格。我正在研究PMP::longest_border
,以在我的网格中引入虚拟接缝。