« 地下ともお別れ | Main | 本いろいろ »

September 02, 2005

CG課題

コンピュータグラフィックス論の課題を最終締め切り当日になってようやく提出した。4問中3問を実装すればいいのだが、最もマゾ的と言われる課題2に挑んでしまったのがたたって、ものすごい時間を取られてしまった。

立方体の描画というのはちょっとした思い入れがある。高校生の頃、数学で三角関数を習ったことをきっかけに3次元グラフィックスをやってみようと思い(DirectXやOpenGLを使うことは念頭になく、あくまで自分で直接描画してみたいということだった)、プログラムを書いてみたことがある(*1)。透視投影は簡単にできてワイヤーフレームの立方体を描くところまでは成功したのだが、隠線消去をしようとしたところで「面の法線ベクトルを外積で求める」という意味がわからなくてそのまま挫折してしまったのだった(*2)。他には、まだ行列を知らなかったのでCGの本に書いてあった回転行列が意味不明で嫌になったということもあった。

というような話を演習3で西田研に行ったときにしたのだが、課題2はつまりそのせいで作られた設問なのだろうか?とちょっと深読み。そんなわけで課題2には相当無駄に力を入れてしまった。高校1年と大学4年を比較するのもどうかと思うが、昔できなかったことができるようになったと実感できるのはやはりうれしいものである。

以下はJavaの話。

久々のJavaであったのでいろいろはまった。最もはまったのが、「ボタン等のswingコンポーネントが再描画されない」という現象。数時間試行錯誤したあげく、どうやらメインのキャンバスで行っていたg.drawImage(image, 0, 0, this);が問題だったらしい。これをg.drawImage(image, 0, 0, null)もしくはg.drawImage(image, 0, 0, getParent())にしたら解決。「swingは画面全体で1つのダブルバッファリング用バッファを持ち、そこに描画を行わせる」という話があるのでそれに絡んでのことだろうか。drawImageは一応非同期に行われるらしいがその辺の絡み?よくわからん。GUIプログラミングの複雑度ではJavaはまだマシな方だとは思うが、やはり複雑怪奇である。

ちなみに今回はじめてJDK 5.0、いわゆるTigerを使ってみたが、なかなかよい。これまでのJavaで最も気にくわなかった、「コレクションクラスからオブジェクトを取得する際にキャストが必要」という罠的仕様がGenericによってほとんど消え去っている点を評価したい。あとはやっぱり、constは欲しいなぁ。Javaは全て参照渡しが基本である以上、やはりconstがないと不安である。せっかく予約語には入っているのだから、早いところ導入してもらいたいものだ。

今回はかなり関数型的なプログラミングを行った。すなわち、引数に渡されたオブジェクトの状態はいじらずに、新しいオブジェクトをnewして返すということである。何となくコストが気になるが、OCamlだって明示的にnewと書かないだけで似たようなことをしているわけで(*3)、コストについてはぐたぐた考えなくていいのかも知れない。昨今のJVMでは小規模・単寿命のオブジェクトはcopying GCみたいな機構で管理されているらしいので、アロケートも一瞬でできるはず。と考えると、最終的には全てのクラスをimmutableにして、newで生成…ということになるのだろうか。

それと演算子オーバーロードを削ったのはやはり犯罪である。何が悲しくてVector3D v = Vector3D.add(eyepoint, Vector3D.mul(eyedir, dist));なんてコードを書かないといけないのか。Vector3D v = eyepoint + dist*eyedir;と書けてしかるべきである。Javaはなんだかんだいって無節操なので、そのうち取り入れてくれるのではないかと期待しておくか。

(*1)最終的な目標は、「父の研究室にあったMacに入っていた3Dブロック崩し的なゲーム」を作ることだった。当然ながら実現せず。今なら作れるだろう。
(*2)今思うに、面の向きなど気にせずに単純にZバッファを用いれば当時の数学的知識でも余裕で隠面消去を実現できたはずなのだが、当時読んでいた「実習グラフィックス」は相当古い時代の本だからか、Zバッファ法について一切記述していなかった。執筆された当時のハードウェア環境ではZバッファは贅沢な代物だったのかもしれない。また、当時の自分にはZバッファ法を自力で思いつくだけの下地もなかった。(もしかしたら、持っていない3冊目「応用グラフィックス」には書いてあるのかも知れないが。)
(*3)もっともOCamlには多くの場合参照透明性があるという前提があり、場合によってはnewをさぼって以前のオブジェクトを再利用する、あるいは以前のオブジェクト+変更点で済ます、なんていう最適化もできそう。実際どこまでやってるのかはわからないが。

|

« 地下ともお別れ | Main | 本いろいろ »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference CG課題:

« 地下ともお別れ | Main | 本いろいろ »