*Catmull-Clark細分割法(CGALライブラリ) [#f3bfe3d2]

近似細分割手法の1つであるCatumull-Clark再分割法を利用して、凸凹な表面メッシュを滑らかにしたいと思います。

今回使用した表面メッシュは、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%,表面メッシュ);

**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'''ファイル:

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS