■コンテスト用レイトレーサ 入力:SLDファイル:CGに表示する3D物体の大きさ、向き、座標等を記述した テキストファイル。後述。 フォルダ sld/ 以下にサンプル有り。 コンテストで使用するのは contest.sld 出力:PPMフォーマットの画像 ■使い方など ocaml がインストールされた環境が必要 make すると実行ファイル min-rt ができる 標準入力からSLD ファイルを入力(未確認) 標準出力にPPM画像を出力(未確認) PPM画像はフリーの画像ビューアで見れる。 ■プログラムの性質 ・一般的なアーキテクチャならコード・データ合わせてSRAM(4MB)だけで足りるはず ・GCは不要(プログラムの最初で割り当てた配列を使い回す) ・関数の部分適用はしない ■コンテストに向けた改造 ※コンテストでは入力と出力をシリアル回線を通して行う ※コンテストでは miniMLRuntime.ml に記述されているライブラリを自作の 計算機向けに実装して使う。コンパイラの組み込み関数にしても良いし アセンブリ言語あるいはocaml で書いたサブルーチンでも良い。 ※コンテストではSLDファイルの入力と画像の出力にシリアル回線を使う。 ■SLDファイルのフォーマット ※ソースから解析したもの.保証無し. ※ $ が頭に付いているのは非終端記号 F が頭に付いているのは float I が頭に付いているのは int + は0回以上の繰り返し $SLDファイル :: = $環境定義 $オブジェクト定義列 $ANDネット定義列 $ORネット定義列 ※回転角の方向は実際に試行錯誤して調べてください。 $環境定義 ::= $スクリーン中心座標 F視線ベクトル方向1回転角(deg) F視線ベクトル方向2回転角(deg) Fライト個数(無視されるはずだが1に固定) F光線ベクトル方向1回転角(deg) F光線ベクトル方向2回転角(deg) F光線強さ(一応255に固定) ※オブジェクト定義は60個まで $オブジェクト定義列 ::= $オブジェクト定義+ -1 ※物体サイズの解釈は形状によって異なる 直方体→X,Y,Zサイズ 無限平面→法線ベクトル 二次曲面→境界面を与える方程式 sgn(A)/(A*A)*X^2 + sgn(B)/(B*B)*Y^2 + sgn(C)*(C*C)*Z^2 = 1 のA B Cパラメータ ※色はRGB各 0 -- 255 ※テクスチャは0:なし、1:チェッカ、2:ストライプ、3:同心円、4:球面上の斑点 $オブジェクト定義 ::= Iテクスチャ I形状(1:直方体, 2:無限平面, 3:二次曲面) I反射タイプ(1:非鏡面, 2:鏡面) I回転の有無(0に固定) F物体サイズX F物体サイズY F物体サイズZ $オブジェクト位置 F反転フラグ(正か負で境界面のどちら側を物体内部にするかが変わる) Fディフューズ(0--1) Fハイライト(0--255) F色R成分 F色G成分 F色B成分 $ANDネット定義列 ::= ANDネット定義+ -1 ※各ANDネット定義は、並べたオブジェクトの共通部分オブジェクトを定義する $ANDネット定義 ::= オブジェクトID+ -1 $ORネット定義列 ::= ORネット定義+ -1 ※各ORネットは、並べたANDネット定義全てから成る和集合オブジェクトを定義する ※レンジプリミティブとは、この和集合オブジェクトへの交差判定のカットに使用 するバウンディングオブジェクト。すなわち、このオブジェクトに視線が交差 しない場合は、交差判定の処理がスキップされ、交差は無いものとして処理される。 ※レンジプリミティブを定義しない場合はIDを99にする。 $ORネット定義 ::= レンジプリミティブオブジェクトID ANDネット要素ID+ -1 $スクリーン中心座標 ::= $XYZ座標 $オブジェクト位置 ::= $XYZ座標 $XYZ座標 ::= F座標X F座標Y F座標Z 2003/11/30 方向ベクトル初期化処理の不備を修正 円錐オブジェクトの衝突判定テーブルが作られないバグを修正 2003/12/04 配列アクセス A.(B) のAの部分が必ず変数になるよう書き換え