Catmull-Clark細分割法(CGALライブラリ)

近似細分割手法の1つであるCatumull-Clark再分割法を利用して、凸凹な表面メッシュを滑らかにしたいと思います。 Catumull-Clark再分割法は、CGなどで凸凹した面を滑らかに表示するために、レンダリング時によく使用されます。

今回使用した表面メッシュは、2本の円管を含む画像データから、円管表面をマーチンキューブス法を利用して取り出したものです。画像の解像度が低いため、円管表面は凸凹しています。

表面メッシュ

今回使用したプログラムはCGALライブラリCatmull-Clark Subdivisionの例題をそのままです。

結果は下絵のように円管からは程遠いですが、表面はやや滑らかになりました。細分割された面は、特異点以外ではC2連続、特異点でC1連続になります。

catmull_clark

CatmullClark_subdivision.cpp

Everything is expanded.Everything is shortened.
  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>
 
// 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;
}

ダウンロードとビルド

ソースコードとCMakeLists.txtファイル:


添付ファイル: filecatmull_clark_cgal.png 1283件 [詳細] filec3t3_surface_mesh.png 1257件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-06-06 (月) 14:12:33 (553d)