CGAL 自适应各向同性重网格化
Remeshing
CGAL 自适应各向同性重网格化。
三角形网格是计算机图形学和几何建模中主要的表面表示形式。高质量的网格一方面必须产生光滑表面几何形状的足够精确的近似,另一方面应该允许数值稳定计算的三角形组成。这需要(a)使采样密度适应基础几何体的曲率,并且(b)使网格体三角形面片尽可能为等边三角形——这两者都是自适应各向同性重新网格化的目标。
学者提出了一种自适应各向同性重新网格划分技术:对均匀重新网格划分方法的简单扩展,实现高效且高质量的曲率自适应重新网格划分,该算法足够快,可以再交互式应用程序中使用,并且产生的网格质量与计算成本昂贵的多的方法相当。
Isotropic Incremental Remeshing 各向同性增量重网格化
实现了Botsch等人提出的基于三角形的增量式各向同性重网格化算法。该算法增量地执行简单操作,如边分割、边折叠、边翻转和Laplacian
平滑。重新网格化的面片的所有顶点被重新投影到原始表面,以保持输入的良好近似。
多边形网格的三角区域可以使用函数 CGAL::Polygon_mesh_processing::isotropic_remeshing()
重新网格化,如图所示。该算法有两个参数:重新网格化表面块的尺寸字段对象,以及上述操作序列的迭代次数。
各向同性重新网格化:(a)三角化的输入曲面网格。(b)表面均匀且完全重新网格化。©选择要重新网格化的面片。(d)选取的曲面网格均匀重新网格化
尺寸场建立重新网格化表面的局部目标边缘长度。提供了两个尺寸域:均匀尺寸域和曲率自适应尺寸域。当 CGAL::Polygon_mesh_processing::Uniform_sizing_field
时,所有三角形边的长度都相等。当 CGAL::Polygon_mesh_processing::Adaptive_sizing_field
时,三角形边的长度依赖于局部曲率——较短的边出现在曲率较高的区域,反之亦然。均匀大小字段和自适应大小字段之间的区别如下图所示。
各向同性重新网格化中的字段尺寸:(a)统一尺寸场。(b)基于曲率的自适应尺寸场。
随着迭代次数的增加,网格趋于平滑,更接近目标边缘长度。添加了一个额外的选项来保护(即不修改)一些给定的折线。在某些情况下,这些折线太长,在保护它们的同时达到所需的目标边缘长度是不可能的,并导致在事件面中出现边缘分裂的无限循环。为了避免这个陷阱,在重新网格化之前,应该对约束边列表调用 CGAL::Polygon_mesh_processing::split_long_edges()
函数。
在三维网格生成包中实现的网格生成算法可以对给定的三角网格进行重新网格化。该算法基于受限Delaunay
三角剖分的Delaunay
细化,生成在简单曲面大小、曲面近似、面片形状和曲面拓扑等方面满足要求的三角曲面网格。输入网格上的一组边可以作为约束来建立和保护一组折线特征,这些折线特征经过重采样,同时保持输入特征图的拓扑结构。
这个三角曲面重新网格化的解决方案在这个包中可用,函数 CGAL::Polygon_mesh_processing::surface_Delaunay_remeshing()
。为CGAL::make_mesh_3()
定义的所有网格划分准则可直接用于simplices
的大小、面片的形状、曲面近似、拓扑结构和一维特征采样。
测试
Code Demo
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/remesh.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
#include <CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;
namespace PMP = CGAL::Polygon_mesh_processing;
int main(int argc, char* argv[])
{
const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/nefertiti.off");
Mesh mesh;
if (!PMP::IO::read_polygon_mesh(filename, mesh) || !CGAL::is_triangle_mesh(mesh)) {
std::cerr << "Not a valid input file." << std::endl;
return 1;
}
std::cout << "Start remeshing of " << filename
<< " (" << num_faces(mesh) << " faces)..." << std::endl;
const double tol = 0.001;
const std::pair edge_min_max{0.001, 0.5};
PMP::Adaptive_sizing_field<Mesh> sizing_field(tol, edge_min_max, faces(mesh), mesh);
unsigned int nb_iter = 5;
PMP::isotropic_remeshing(
faces(mesh),
sizing_field,
mesh,
CGAL::parameters::number_of_iterations(nb_iter)
.number_of_relaxation_steps(3)
);
CGAL::IO::write_polygon_mesh("out.off", mesh, CGAL::parameters::stream_precision(17));
std::cout << "Remeshing done." << std::endl;
return 0;
}
相关链接
原文地址:https://blog.csdn.net/mrbaolong/article/details/144741187
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!