Catmull-Clark細分割法(CGALライブラリ) †
近似細分割手法の1つであるCatumull-Clark再分割法を利用して、凸凹な表面メッシュを滑らかにしたいと思います。
Catumull-Clark再分割法は、CGなどで凸凹した面を滑らかに表示するために、レンダリング時によく使用されます。
今回使用した表面メッシュは、2本の円管を含む画像データから、円管表面をマーチンキューブス法を利用して取り出したものです。画像の解像度が低いため、円管表面は凸凹しています。
今回使用したプログラムはCGALライブラリのCatmull-Clark Subdivisionの例題をそのままです。
結果は下絵のように円管からは程遠いですが、表面はやや滑らかになりました。細分割された面は、特異点以外ではC2連続、特異点でC1連続になります。
CatmullClark_subdivision.cpp †
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
-
!
-
-
|
|
|
|
!
|
|
|
|
|
|
|
|
-
!
|
|
!
| #include <CGAL/Polyhedron_3.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Subdivision_method_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
int main(int argc, char* argv[])
{
if (argc != 2) {
std::cerr << "Usage: CatmullClark_subdivision d < filename" << std::endl;
std::cerr << " d: the depth of the subdivision (0 < d < 10)" << std::endl;
std::cerr << " filename: the input mesh (.off)" << std::endl;
return EXIT_FAILURE;
}
int d = argv[1][0] - '0';
Polyhedron P;
std::cin >> P;
CGAL::Subdivision_method_3::CatmullClark_subdivision(P,d);
std::cout << P;
return EXIT_SUCCESS;
}
|
ダウンロードとビルド †
ソースコードとCMakeLists.txtファイル: