言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

三次元オブジェクトを表現する

モーフの世界と同じように、Croquet の世界でも、画面に表示させる一つ一つの物体はそれぞれオブジェクトになっている。形を表示する際にはオブジェクトごとにopenGL のコマンドを使って描画するわけだが、ちょっと考えている事がある。

四角い物体がある。これを描画するためには、例えば線を沢山引っ張って中を塗りつぶすわけだ。これは良い。次に、枠みたいな形の物体があるとする。この枠が角ばっていたら、先程作った四角い物体を組み合わせて作れば良さそうな物だが、実際は色々な理由でそうはしない。この枠が基本的な部品の場合、枠を作るたびに子供のオブジェクトが4つも出来るのは関心しないし。また、枠にそれぞれの四角の位置情報などを状態として持つのは冗長だ。だからまた線を引っ張ってそこから枠の形を作る事になる。これが面倒臭い。

要するに、四角い物体であるということと、四角い見た目だ事は別の性質で、四角い物体である事を定義するのは重たいことだが(状態が必要である)、四角い見た目を計算するだけなら軽い事(参照透明性がある)で、少しの重たい定義と沢山の軽い定義を組み合わせて枠を表示させたいのだが、Squeak の再利用の単位はオブジェクトごとなのでなかなか上手に出来ない。

一つの方法は、表示デバイスを表すオブジェクトに基本的な描画メソッドを増やす事。例えばモーフだと、四角を表示させる事くらい Canvas に定義されてる。また、どこかのクラスメソッドとして書いておいて、関数的に呼び出すという方法もある。だけどこういう形でメソッドを増やしてゆくのはなんとなく気持ち悪い気がする。

例えば、こないだの仕事で物体に影をつけるという事。これも似たような状況で、すべての物体に影をつける必要は無いので、影をつけるという性質を分離したい。だけど影というオブジェクトを別に作って委譲させるという程の事でも無い。なぜなら、影の状態はすべて元の物体に依存していて、関数的に動作するため、影自体には状態が不要なのだ。状態の無い要素をオブジェクトにしてはいけないとは誰も言わないが、僕の嫌いな状況だ。

と言う事で結論は無いのだが、これって trait を使えば一挙解決するのかな?