- 追加された行はこの色です。
- 削除された行はこの色です。
近似細分割手法の1つであるCatumull-Clark再分割法を利用して、凸凹な表面メッシュを滑らかにしたいと思います。プログラムは[[CGALライブラリ:http://www.cgal.org]]の[[Catmull-Clark Subdivision:http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Subdivision_method_3/Chapter_main.html#Section_52.4]]にあります例題をそのまま使用します。
*Catmull-Clark細分割法(CGALライブラリ) [#f3bfe3d2]
近似細分割手法の1つであるCatumull-Clark再分割法を利用して、凸凹な表面メッシュを滑らかにしたいと思います。
Catumull-Clark再分割法は、CGなどで凸凹した面を滑らかに表示するために、レンダリング時によく使用されます。
今回使用した表面メッシュは、2本の円管を含む画像データから、円管表面をマーチンキューブス法を利用して取り出したものです。画像の解像度が低いため、円管表面は凸凹しています。
#ref(c3t3_surface_mesh.png,left,nowrap,40%,表面メッシュ);
今回使用したプログラムは[[CGALライブラリ:http://www.cgal.org]]の[[Catmull-Clark Subdivision:http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Subdivision_method_3/Chapter_main.html#Section_52.3]]の例題をそのままです。
結果は下絵のように円管からは程遠いですが、表面はやや滑らかになりました。細分割された面は、特異点以外ではC2連続、特異点でC1連続になります。
#ref(catmull_clark_cgal.png,left,nowrap,40%,catmull_clark);
**CatmullClark_subdivision.cpp [#n9b7baec]
#code(c){{
#include <CGAL/Polyhedron_3.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Subdivision_method_3.h>
// IO
#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; // read the .off
CGAL::Subdivision_method_3::CatmullClark_subdivision(P,d);
// Output
std::cout << P;
return EXIT_SUCCESS;
}
}}
**ダウンロードとビルド [#w0808ed9]
ソースコードと'''CMakeLists.txt'''ファイル: