2009年7月28日火曜日

Haskellでレイトレーシング(第1回)〜導入

Haskellでレイトレーサを書き始めました。ベースにしているのは、「ANSI Common Lisp」という本に載っていたレイトレーサのサンプルです。Common Lispで書かれているものをHaskellで書いています。

Haskellで書いたコードはこれで、実行すると以下のようなpgm画像が得られます。

Common LispのコードをHaskellで書くにあたっては、次のようなところがポイントでした。

1.ループを使わない

Common Lispのコードでは、各ピクセルごとに手続き的にループを回すようになっていますが、Haskellではそれをループを使わずに記述します。どのように書くのかというと、全ピクセルをリストで表現し、それを関数に渡すのです。Haskellの遅延評価が活きてくるポイントです。

2.型による分岐にはパターンマッチを用いる

Common Lispのコードでは、物体の型を判別して処理を分岐しています。Haskellでは、引数のパターンマッチでこれをもっと自然に表現できます。

3.NilをMaybeモナドで表現する

レイが物体と衝突しない場合に、Commpn Lispのコードでは暗黙的にNilを返すように記述されています。それを、Maybeモナドを使いNothingで表現するようにしました。レイが物体に衝突するときにはその交点を返し、衝突しないときにはNothingを返します。

4.タプルを返せる

Common Lispのコードではmultiple-value-bindを使って値の組を返す部分があります。Haskellではそのままタプルを返すことができます。

5.衝突点の計算

Common Lispのコードでは、もっとも視点に近い衝突点を探すためにループが用いられています。Haskellでは、この衝突点の計算もループを使わずに表現します。foldrを使って、Haskellらしい形で表現しました。

次回以降の投稿で、これらのポイントを1つずつ説明していきます。

■他の記事
Haskellでレイトレーシング(第1回)〜導入
Haskellでレイトレーシング(第2回)〜ループは使わない
Haskellでレイトレーシング(第3回)〜型による分岐にはパターンマッチを用いる
Haskellでレイトレーシング(第4回)〜NilはMaybeモナドで表現する
Haskellでレイトレーシング(第5回)〜タプルを返せる

2009年7月27日月曜日

メアリー・ブレア展

現代美術館(MOT)で開かれている、メアリー・ブレア展に行ってきました。メアリー・ブレアは、ディズニー映画のコンセプト・アートを手がけた女性です。

「シンデレラ」や「不思議の国のアリス」、「ピーターパン」などのコンセプト・アートが展示されて、映画の雰囲気がギュッと凝縮されていました。メアリーの絵の特徴は鮮やかで強烈な色使いで、マティスやデュフィを連想させます。

こういう絵が好き♪

2009年7月26日日曜日

世界のへそ


今日のBingトップはバリ島のアグン山。そのHotspotの中に、
バリ島北部に位置するアグン山。ヒンドゥー教で世界の中心と考えられていることから「世界のへそ」と呼ばれています。
とあった。

これを見て「なんでヒンドゥー教で世界の中心と考えられている山がバリ島にあるの?」と思い、調べてみた。

検索してみたところ、ここによると、
バリ島では、インドネシアのほかの島々とはちがって、島民の93.2%が、ヒンドゥー教を信仰している。これに、アグン山信仰に代表されるような、むかしから伝わる土着の自然信仰がくわわって、独特のバリ・ヒンドゥー教世界がつくられた。
とある。

また、Wikipediaによると、
バリ島では、クディリ朝の支配下に入った11世紀初めごろからヒンドゥー・ジャワ文化の影響が及び始め、その後しばらくジャワの支配を離れるが、マジャパヒト王国がバリを征服した1343年以後、16世紀初めにジャワのイスラム化によって同王国が滅亡するまでにヒンドゥー化が広く浸透した。
とある。

どうやら、バリ島には11世紀初めにヒンドゥー教が渡来してきて、それが土着の自然信仰と混ざって、インドとは異なるバリ・ヒンドゥー教ができたらしい。そして、その中にアグン山信仰も受け継がれているそう。

バリ島が独特なのは、こういうことだったのね。

2009年7月22日水曜日

Electronics Manufacturing Service


Appleは、自分で工場を持ってせっせとiPodを作っているわけではなくて生産を外部に委託している。そういった生産設備を持たない会社が製品の生産を委託する先の会社って何というのだろうと思っていた。

シリコンチップの場合はファブレス(fubless)とファウンダリ(foundary)という単語で調べられるが、電子機器の場合はどうも呼び方が違うようで検索しても見つからない。

では、そういう会社は何と呼ばれているかというと、EMS(Electronics Manufacturing Service)というらしい。

大手では、

  • ホンハイ(台湾)
  • フレクストロニクス(シンガポール)
  • ソレクトロン(アメリカ)
  • ウィストロン(台湾)
  • セレスティカ(カナダ)
  • シークス(日本)

といった会社がある。やっぱり台湾が強いのか、2社が台湾にある。あとはアメリカ、カナダ、シンガポール。日本にもあるみたい。

発注元と受託先の役割分担としてはおおまかに2種類あって、

  • 設計は発注元が行い生産を受託するOEM
  • 上流工程である設計工程も含めて受託するODM(original design manufacturer)

があるらしい。ODMでは設計もやる。

EMSについて疑問に思ったことは、

  • 製品の仕様を用意すれば内部設計なんかはやってくれるのだろうか?
  • こういう会社と協力すればベンチャーがプロダクトを売ることができるのでは?
  • ロットってどれくらいで受け付けるんだろう?
  • たとえば毎年新しいのがたくさんでてくるおもちゃなんかも、こういう会社で生産されているんだろうか?

2009年7月11日土曜日

粒子法のプログラム最終回(粒子の出力)


最終回となる今回は、計算した粒子の出力について説明します。

このプログラムでは、計算した粒子をpov-rayのフォーマットで出力しています。

第1回に載せたムービーは、このプログラムでタイムステップごとに出力した.povファイルをレンダリングし、さらにffmpegで動画にしたものです。

粒子を出力するコードは以下のようになっています。

void output_particles( Particles* ps )
{
static int num = 0;
std::string file_name = \
(boost::format( "result%08d.pov" ) % num++ ).str();
std::cout << "processing " << file_name << " ..." << std::endl;
std::ofstream f( file_name.c_str() );
if ( ! f )
{
std::cerr << "cannot open " << file_name << std::endl;
exit(1);
}

f << "#include ¥"colors.inc¥"¥n"
<< "camera {¥n"
<< "  location <10,>¥n"
<< "  look_at <10,>¥n"
<< "}¥n"
<< "light_source { <0,> color White }¥n";
FOR_EACH_PARTICLES( ps, p )
{
f << "sphere {¥n"
<< "  <" << r(0) << ", " << r(1) << ", " << r(2) << ">, 0.5¥n"
<< "  texture {¥n"
<< "    pigment { color Yellow }¥n"
<< "  }¥n"
<< "}¥n";
}
f << std::endl;
}
タイムステップごとに.povファイルを出力しています。

さらに、この投稿に載せたムービーでは、計算した粒子から求めた陰曲面をマーチングキューブでポリゴン化し、反射や屈折も考慮してレンダリングしています。

これでひととおりの説明が終わりました。このあとの発展としては、3次元にしたり、物体との相互作用を入れたり、GPUで処理したりといったことを考えています。

粒子法のプログラム
粒子法のプログラム第1回(概要)
粒子法のプログラム第2回(プログラムの大枠)
粒子法のプログラム第3回(データ構造)
粒子法のプログラム第4回(密度と圧力の計算)
粒子法のプログラム第5回(力の計算)
粒子法のプログラム第6回(境界条件と粒子位置の更新)
粒子法のプログラム最終回(粒子の出力)

その他の解説エントリ
SPHによる巻き波のシミュレーション1
SPHによる巻き波のシミュレーション2
SPHによる巻き波のシミュレーション3
このあとやりたいこと

固液連成シミュレーションに関するエントリ
粒子法による固液連成シミュレーション

流体シミュレーションに関するエントリ
【粒子法】粒子を流体としてレンダリング
3次元の粒子法シミュレーション
粒子法のシーンを2倍のサイズにしてみたが…
粒子法のシーンを2倍のサイズにしてみた
Haskell、OCamlでSPH法
カメラ位置を変えて流体をレンダリング
Bunny-shaped fluid simulation

剛体シミュレーションに関するエントリ
粒子ベース剛体シミュレーション(プレビュー)
粒子ベース多体衝突シミュレーション
引き続き、粒子ベース剛体シミュレーション
Falling Rigid Bunnies

動画
シミュレーションの結果をレンダリングして作った動画です。流体シミュレーションや剛体シミュレーションの動画を見ることができます。

動画の一覧


--