Sunday, November 28, 2010

某舘山寺温泉に行ってきました

いってまいりました,某ワークショップに,某舘山寺温泉に.
受講の都合で,後半からの参加になりましたが想像以上に楽しかったです.
他大学の学生との交流もほどほどにできました.
それに温泉にもつかってきました.その場では,家で入ってる風呂と大差ない気がしましたが,疲れも無くなりましたし,実際は効果あったような気がします.
夕飯のコースもおいしかったです.

発表は最後のセッションの最後でして,皆疲れている様子でしたが,お構いなしでよくしゃべれました.おしゃべりの内容はテクスチャです.詳細は教えません.会場からの質問も見た中では最も多かったですし,興味を持っていただいたようでした.質問の内容は,発表した手法をより一般的に使えるようにするための議論(高さのみならず色や材質,メッシュに依存しないようにするためには等々の議論)や入力情報を足して操作性を上げるための議論がメインでした.
実はこれらの質問は,事前にM研究室で行った発表練習のときに修士2年の学生から出た質問と似たような内容でした.つまり国内のCG界のトップ層と同等の質問ができるくらいに,ここの修士が育っていることがわかりました.

はい,これで発表が終わり,会場を後にし,某M先生と一緒に浜松に行って鰻を食べてきました.行った店は,某清水屋です.某早稲田の博士後期の学生(自称M先生ファン)が先生に教えてくれたそうです.
で,しばらく待っていたのですが,出てきたうな重は最高においしかったです.これまで食べてきた鰻とは別格においしかったような気がしました.最近良いものを口にしていないので,特にそのように思ったのかもしれませんが,とにかくおいしかったです.サブのくせにビビビッと来たのが肝吸いでして,一口すすっただけで,ニヤリです.ちなみにおごってもらいました.また頑張ります.
あんなにおいしいものを食べて思ったのが,あんなのばっかり食ってたら人間ダメになる.

そういえば,食べ終わったあと,先生が手のにおいを嗅いで「鰻くさい」と言ってましたがその時は理解できませんでした.電車乗って自分が鰻くさいことに気付きました.

そんなこんなで,時間もないので,さっさと帰ってきました.

Tuesday, November 23, 2010

cmake→slnファイル→ビルド

インストールメモ.
CMAKEしたあと,作られたslnソリューションファイルを開いて,ビルドしなければ,ライブラリが生成されません.ビルド時は,ソリューション構成が4つ選択できるので,それぞれのビルドします.これでライブラリが生成され,参照できるようになります.

Friday, November 19, 2010

Polyhedron_incremental_builder_3でのインプットエラー

Polyhedron_incremental_builder_3でのインプットに関して,エラーが出たのでメモ.
facetを指定するとき,すべて同じ方向でインデックスを用意する必要があるようです.
たとえば下の例では,7654をコメントにして,//でコメントされた4567でfacetを指定すると,3267と反対になるため,エラーがでます.

B.begin_facet();
B.add_vertex_to_facet(3);
B.add_vertex_to_facet(2);
B.add_vertex_to_facet(6);
B.add_vertex_to_facet(7);
B.end_facet();
B.begin_facet();
B.add_vertex_to_facet(7);
B.add_vertex_to_facet(6);
B.add_vertex_to_facet(5);
B.add_vertex_to_facet(4);
//B.add_vertex_to_facet(4);
//B.add_vertex_to_facet(5);
//B.add_vertex_to_facet(6);
//B.add_vertex_to_facet(7);
B.end_facet();


ちなみにエラーはpolyhedron_incremental_builder_3.hの440行目でm_errorがtrueになることで発生します.
同じ方向の面を検出するチェッカーがこの行の前に入っていて,m_errorがtrueになることで次からの入力を拒絶しています.

Thursday, November 18, 2010

Polyhedron_incremental_builder_3を使ってみる

これまで私も任意の多角形メッシュをCGALで扱ったことなかったので,知らなかったのですが,CGALでは Polyhedron_incremental_builder_3 を使って,閉じた多角形メッシュを作ることができます.
たとえば,examplesのソースをいじって六面体を作ると以下のようになります.

#include < CGAL/Simple_cartesian.h >
#include < CGAL/Polyhedron_incremental_builder_3.h >
#include < CGAL/Polyhedron_3.h >

template < class HDS >
class Build_mesh : public CGAL::Modifier_base< HDS > {
public:
void operator()( HDS& hds) {
// Postcondition: `hds' is a valid polyhedral surface.
CGAL::Polyhedron_incremental_builder_3< HDS > B( hds, true);
B.begin_surface( 8, 6 );
typedef typename HDS::Vertex Vertex;
typedef typename Vertex::Point Point;
B.add_vertex( Point( 0, 0, 0));
B.add_vertex( Point( 0, 1, 0));
B.add_vertex( Point( 1, 1, 0));
B.add_vertex( Point( 1, 0, 0));
B.add_vertex( Point( 0, 0, 1));
B.add_vertex( Point( 0, 1, 1));
B.add_vertex( Point( 1, 1, 1));
B.add_vertex( Point( 1, 0, 1));
B.begin_facet();
B.add_vertex_to_facet(0);
B.add_vertex_to_facet(1);
B.add_vertex_to_facet(2);
B.add_vertex_to_facet(3);
B.end_facet();
B.begin_facet();
B.add_vertex_to_facet(3);
B.add_vertex_to_facet(2);
B.add_vertex_to_facet(6);
B.add_vertex_to_facet(7);
B.end_facet();
B.begin_facet();
B.add_vertex_to_facet(7);
B.add_vertex_to_facet(6);
B.add_vertex_to_facet(5);
B.add_vertex_to_facet(4);
B.end_facet();
B.begin_facet();
B.add_vertex_to_facet(4);
B.add_vertex_to_facet(5);
B.add_vertex_to_facet(1);
B.add_vertex_to_facet(0);
B.end_facet();
B.begin_facet();
B.add_vertex_to_facet(0);
B.add_vertex_to_facet(3);
B.add_vertex_to_facet(7);
B.add_vertex_to_facet(4);
B.end_facet();
B.begin_facet();
B.add_vertex_to_facet(1);
B.add_vertex_to_facet(5);
B.add_vertex_to_facet(6);
B.add_vertex_to_facet(2);
B.end_facet();
B.end_surface();
}

};


add_vertexで頂点を追加して,begin_facetとend_facetの間に面を定義します.
面の定義はadd_vertex_to_facetでインデックスを追加します.
これらをbegin_surfaceとend_surfaceではさめば,定義完了です.

呼び出して使うときは,まず以下を記述します.

typedef CGAL::Simple_cartesian < double > Kernel;
typedef CGAL::Polyhedron_3 < Kernel > Polyhedron;
typedef Polyhedron::HalfedgeDS HalfedgeDS;


呼び出し側は,以下のようにPolyhedronを用意して,delegateするようにします.

Polyhedron P;
Build_mesh< HalfedgeDS > mesh;
P.delegate( mesh );

この例から任意の形状用に作りかえれば,細分割に任意の形状を突っ込むことができるようになります.
exampleがこのような構成になっているので,きっとこれでいいのだと思います.

subdivisionの例

CGALには頻繁に使われる細分割手法が実装されていて,かつそこそこ高速に計算してくれるので非常に使いやすいです.ただマニフォールドのみという制約があった(と記憶している)ので,そこは使用者が実装しなければならない(はず)です.
使い方はPolyhedronと分割数を関数に渡すだけです.

たとえば以下のコードで3回のDoo-Sabinです.
まず,関数を使えるようにヘッダーをインクルードします.

#include < CGAL/Subdivision_method_3.h >

呼び出し側で以下のコードです.

Polyhedron P;
Build_mesh< HalfedgeDS > mesh;
P.delegate( mesh);

CGAL::Subdivision_method_3::DooSabin_subdivision(P, 3);


ここでは,Build_meshで六面体のPolyhedronを生成して,delegate関数でPにデータを渡しています.
0-3回の例が以下です.






以上.
簡単でしょ.

Tuesday, November 16, 2010

VSでCGALを読み込んでコンパイルが通るまで

CGALを使ったプログラムのビルドが通らない原因はCGALのインストールがうまくいっていないことだと思います.私も結構苦労しました.2時間くらい調べたりしてようやくわかった感じです.ですので,ここでは,CGALが本当にインストールできたかをテストする方法を記述します.
下で示す手続きでビルド(コンパイル)を実行して通れば,CGALのインストールができていると言えます.逆にビルドが通らなかったら,CGALのインストールができていないと言えます.
ここではVisual studio 2010で実験しますので,ほかの開発環境ではどうなのか知りません.でも,だいたい似たようなものだと予想します.

さて,テスト用の手続きですが,ざっくりいうと次の5ステップです.
1 プロジェクトの作成
2 ソースのコピぺ
3 インクルードディレクトリーの設定
4 ライブラリディレクトリーの設定
5 ビルド
以上です.

1 プロジェクトの作成
VSではまず,プロジェクトを作成しなければビルドも何もできません.
ということで,作ります.
ここではテストなので,win32コンソールアプリケーションを選びます.
で,何も考えずに,完了です.





2 ソースのコピぺ
次にソースのコピペですが,こんなものは何でもいいので,CGALのサンプルからコピーして,貼り付けます.
ここでは,私がこれから着手するサブディビジョンのテスト用に,3D Surface Subdivision Methodsのサンプルをとってきます.



赤い波下線があり,コンパイルエラーが起こることがばっちりわかります.

3 インクルードディレクトリーの設定
次にプロジェクトのインクルードディレクトリーを設定します.
手順は,プロジェクトのプロパティを開いて,「C/C++」→「全般」→「追加のインクルードディレクトリ」にCGALのインクルードディレクトリとboostのインクルードディレクトリを追加します.



ここでのディレクトリは環境に依存するので,適宜調整してください.

4 ライブラリディレクトリーの設定
インクルードディレクトリー同様,リンカーの設定として,ライブラリを設定します.
手順は,プロジェクトのプロパティを開いて,「リンカー」→「全般」→「追加のライブラリディレクトリ」にCGALのライブラリとboostのライブラリを追加します.



これもインクルードディレクトリの設定と同様に,適宜調整してください.
この例では,デバック版を設定していますが,リリース版でビルドする場合は,リリース版を設定します.

5 ビルド
以上で準備は整いました.
ビルドします.



赤い波下線も消え,ログからビルドが正常終了したことがわかります.
これが確認できれば,CGALのインストールは成功しています.

もし,以上の手続きで,エラーが出るようでしたら,失敗しています.
経験上,失敗の例として,CMAKEを実行していない,CMAKE後にコンパイルしていない,CMAKEがミスってる,インストールしたboostのバージョンが悪い,そもそも必要な他のライブラリをインストールしていない等々です.


ユーザー名がKSakuraiってなっていますが,そのあたりは気にせず,無意味に特定しようとか思わないでください.