いきますー。
そういえば、ムービーを作るつもりで、一応録画はできたけど、編集をしなきゃいけないんでした。
GaucheFest は昨日だけだったみたいだけど、 ムービーが全然できない……。
とりあえず、 SGI 画像を出力するところ。 まずヘッダを適当に作って、
(define (binary-list x n) (let loop ((k 0) (part '())) (if (= k n) part (loop (+ k 1) (cons (bit-field x (* k 8) (* (+ k 1) 8)) part))))) (define sgi-image-header-list (list->u8vector `(,@(binary-list 474 2) ; MAGIC 0 ; STORAGE 1 ; BPC ,@(binary-list 3 2) ; DIMENSION ,@(binary-list 640 2) ; X SIZE ,@(binary-list 480 2) ; Y SIZE ,@(binary-list 3 2) ; Z SIZE (RGB) ,@(binary-list 0 4) ; PIXMIN ,@(binary-list 255 4) ; PIXMAX 0 0 0 0 ; DUMMY ,@(make-list 80 0) ; IMAGE NAME ,@(binary-list 0 4) ; COLORMAP ,@(make-list 404 0) ; DUMMY ) ))
gl-read-pixels で、画面のピクセルデータを取得してファイルに出力。
(with-output-to-file (format "out/mephisto-out-~5,'0d.sgi" *current-frame*) (lambda () (let1 pixels (gl-read-pixels 0 0 640 480 GL_RGB GL_UNSIGNED_BYTE) (write-block sgi-image-header-list) (write-block pixels))) )
あー、これではだめでした。 RGB のデータの並び方が違う。 gl-read-pixels で得られるのは、1 ピクセルごとに R、G、B の値が並んでいるんだけど、 SGI フォーマットでは、 それぞれのチャンネルごとにまとめてビットマップデータを入れないといけないみたい。
Rui さんに rlwrap というコマンドを教えてもらう。 さっそく DarwinPorts でインストールしてみた。
便利ー!
先日の LL Gong で流した映像をムービーにする。 まずは、連続する静止画像をつくらないといけないんだけど、 実際にリアルタイムで動かすのと、 ムービーとして書き出すのでは時間のはかり方が違う。
本番のときは、 こんな風にして sys-sleep をつかって実時間で時間の記述をしていました。
(append-painter-streams! strm1) (sys-sleep 3) (append-painter-streams! strm2) (sys-sleep 5) ...
しかし、 ムービーにするときには、 プログラムの実行中の実時間と、 ムービーの中での時間が一定でないので、 sys-sleep とかはつかえない。 代わりに、 再生時のフレームレートが一定であると考えていいので、 フレーム数から時刻を求める。
関係ないけど、 なにか人が操作できるようなアプリケーションがあった方がいいかなぁと、 最近思うようになってきた。
さっき起きた。歯磨きしてコーヒー飲んだら行きます。
ひさびさ。今回は LL Gong の準備。
画像表示のユーティリティを作ってコミットしました。 そろそろデモのシナリオをかんがえるかなぁ。
ふつかめ。今日はプレゼンで使えるように MEPHISTO で画像を表示するテスト。 Mac についている「プレビュー」は、 なぜか SGI 形式で画像を保存できる。 (Illustrator でもできないのに。)
read-sgi-image で画像を読み込んで、 gl-draw-pixels で画面に表示する。 簡単。
-- Function: gl-draw-pixels width height format type pixels Draws a pixel data PIXELS at the current raster position. PIXELS must be a uniform vector compatible to the specified FORMAT and TYPE values.
SGI 画像のチャネル数が 3 だったら、format は GL_RGB。 read-sgi-image がつくるのは u8vector だから、 type はいつも GL_UNSIGNED_BYTE でいい。
MEPHISTO のストリームのコンセプトを C のコードで実現したい。 こんな風に書ける。
void myDisplayFunc(void) { statstrm_p->draw (statstrm_p); statstrm_p = statstrm_p->next(statstrm_p); }
myDisplayFunc は glutDisplayFunc に登録する。
statstrm_p は状態のストリームのつもり。 描画関数を持っている。 next は stream-cdr のような気分。
OpenGL でフルスクリーンにしたいときは、 ゲームモードというのをつかう。
glutGameModeString("width=800 height=600 bpp~24 hertz>=60"); glutEnterGameMode();
プログラム終了時:
glutLeaveGameMode();
原点に戻って C で OpenGL のコードを書いてみる。 この辺を参考にしつつ。
MacOS X の場合、コンパイルオプションはかなり簡単だ。
gcc SimpleAnim.c -framework GLUT -framework OpenGL
ただし、GLUT のヘッダファイルは、GL/glut.h じゃなくて GLUT/glut.h。
0.0.2 リリース。
簡単な HTML 生成プログラムを書いてホームページを作った。 http://mephisto.torus.jp
ホームページつくってます。
日曜日だけ参加します!
API のリファレンスだけ書いても意味が分からないなぁ。
制約システムの面白い例題がないかなぁ。
http://wiliki.torus.jp/wiliki.cgi?Mephisto%3aref
ドキュメント書きかけ。 高レベル API と低レベル API を区別した方がいいな。