GaucheFest:とおる。

GaucheFest:とおる。

とおる。

20th

いきますー。

そういえば、ムービーを作るつもりで、一応録画はできたけど、編集をしなきゃいけないんでした。

15th

2006/09/02 20:10:33 PDT

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 フォーマットでは、 それぞれのチャンネルごとにまとめてビットマップデータを入れないといけないみたい。

2006/09/02 00:49:59 PDT

Rui さんに rlwrap というコマンドを教えてもらう。 さっそく DarwinPorts でインストールしてみた。

便利ー!

2006/09/01 20:07:15 PDT

先日の LL Gong で流した映像をムービーにする。 まずは、連続する静止画像をつくらないといけないんだけど、 実際にリアルタイムで動かすのと、 ムービーとして書き出すのでは時間のはかり方が違う。

本番のときは、 こんな風にして sys-sleep をつかって実時間で時間の記述をしていました。

(append-painter-streams! strm1)
(sys-sleep 3)
(append-painter-streams! strm2)
(sys-sleep 5)
...

しかし、 ムービーにするときには、 プログラムの実行中の実時間と、 ムービーの中での時間が一定でないので、 sys-sleep とかはつかえない。 代わりに、 再生時のフレームレートが一定であると考えていいので、 フレーム数から時刻を求める。

関係ないけど、 なにか人が操作できるようなアプリケーションがあった方がいいかなぁと、 最近思うようになってきた。

2006/09/01 17:22:14 PDT

さっき起きた。歯磨きしてコーヒー飲んだら行きます。

14th

ひさびさ。今回は LL Gong の準備。

2006/08/06 00:42:37 PDT

画像表示のユーティリティを作ってコミットしました。 そろそろデモのシナリオをかんがえるかなぁ。

2006/08/05 22:52:29 PDT

ふつかめ。今日はプレゼンで使えるように 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 でいい。

2006/08/05 01:26:04 PDT

MEPHISTO のストリームのコンセプトを C のコードで実現したい。 こんな風に書ける。

void myDisplayFunc(void)
{
    statstrm_p->draw (statstrm_p);
    statstrm_p = statstrm_p->next(statstrm_p);
}

myDisplayFunc は glutDisplayFunc に登録する。

statstrm_p は状態のストリームのつもり。 描画関数を持っている。 next は stream-cdr のような気分。

2006/08/04 21:19:12 PDT

OpenGL でフルスクリーンにしたいときは、 ゲームモードというのをつかう。

glutGameModeString("width=800 height=600 bpp~24 hertz>=60");
glutEnterGameMode();

プログラム終了時:

glutLeaveGameMode();

2006/08/04 19:32:32 PDT

原点に戻って C で OpenGL のコードを書いてみる。 この辺を参考にしつつ。

MacOS X の場合、コンパイルオプションはかなり簡単だ。

gcc SimpleAnim.c -framework GLUT -framework OpenGL

ただし、GLUT のヘッダファイルは、GL/glut.h じゃなくて GLUT/glut.h。


2006/06/04 02:34:28 PDT

0.0.2 リリース。

2006/06/04 00:46:10 PDT

簡単な HTML 生成プログラムを書いてホームページを作った。 http://mephisto.torus.jp

2006/06/03 21:08:17 PDT

ホームページつくってます。

12th

日曜日だけ参加します!

2006/03/05 00:39:53 PST

API のリファレンスだけ書いても意味が分からないなぁ。

2006/03/04 18:55:05 PST

制約システムの面白い例題がないかなぁ。

2006/03/04 18:50:01 PST

http://wiliki.torus.jp/wiliki.cgi?Mephisto%3aref

ドキュメント書きかけ。 高レベル API と低レベル API を区別した方がいいな。

More ...