角錐のバグ修正

角錐のたぐいはワイヤーフレームでは、 三角に展開されてそれらしく表示されてましたが、 レイトレーシングしてみると表示が乱れてました。

まず、dat.py を変更してコマンドライン引数の指定で、 角錐のデータに切り替えれるようにしておいて、 色々と追いかけてみました。

ローカル座標系とグローバル座標系の関係は dataの辞書のキー'l2g'に設定されてます。 ワイヤーフレームでは'l2g'をローカルからグローバルへの方向に変換して使用します。 レイトレーシングでは視線の直線を'l2g'を使って、グローバルからローカルへと逆変換して使用します。

ここで、逆変換の方向の処理にバグがありました。

diff -urN rt_v11/vecs.py rt_v12/vecs.py
--- rt_v11/vecs.py	2018-03-16 20:38:43.000000000 +0900
+++ rt_v12/vecs.py	2018-03-28 22:25:34.000000000 +0900
@@ -12,10 +12,15 @@
 	e.typ = 'vecs'
 	e.v3 = v3
 	l2g = lambda v_: v.lst_add( map( lambda (a, e): v.op1('*', a, e), zip(v3, v_) ) )
-	g2l = lambda v_: map( lambda a: v.dot_product_len(v_, a), v3 )
+	g2l = lambda v: e.rev().tr('l2g', v)
 	e.tr = lambda d, v: { 'l2g': l2g, 'g2l': g2l }.get(d, l2g)(v)
 
-	e.rev = lambda : new( mt.v3_rev(v3) )
+	e.rev_vs = None
+	def rev():
+		if not e.rev_vs:
+			e.rev_vs = new( mt.v3_rev(v3) )
+		return e.rev_vs
+	e.rev = rev
 
 	e.zoom = lambda zm3: new( map( lambda (v_, zm): v.op1('*', v_, zm), zip(v3, zm3) ) )
 	e.zoom_all = lambda zm: e.zoom( [zm,zm,zm] )

修正前の処理では、座標系のベクトルが同じ大きさで直行してる前提でなければ、正しく動作しなかったようです。 とりあえず、逆行列を使う方向で修正してみると、それらしい表示になりました。

v12.patch

v12.patch メモ
$ cat v12.patch | ( cd rt ; patch -p1 )

$ cd rt

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=poly_n_pyramid name=out/pn_pyramid_wf wf

  :

frm : 282/300(94.0%) : rest 1.11s : 2018/03/28 22:56:27
frm : 299/300(99.6%) : rest 0.06s : 2018/03/28 22:56:27
frm : 300/300(100.0%) : fin 18.63s

まずは1コマだけで。

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=poly_n_pyramid name=out/pn_pyramid1 init_sec=5 n=1

  :

wh : 304044/307200(98.9%) : rest 6.96s : 2018/03/28 23:09:43
wh : 305019/307200(99.2%) : rest 4.80s : 2018/03/28 23:09:42
wh : 306130/307200(99.6%) : rest 2.35s : 2018/03/28 23:09:40
wh : 307200/307200(100.0%) : fin 11m 13.93s

1コマ11分14秒ということは

(11*60+14)*300/60/60/24 = 2.34 (d)

単純計算で丸2日以上はかかりますね。 高速化を検討すべきでしょうか。 解像度半分でピクセル数1/4。半日(12時間)強で手をうってみます。

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=poly_n_pyramid name=out/pn_pyramid2 div=2

  :

wh : 75347/76800(98.1%) : rest 2.89s : 2018/03/29 12:19:29
wh : 75933/76800(98.8%) : rest 1.72s : 2018/03/29 12:19:29
wh : 76524/76800(99.6%) : rest 0.54s : 2018/03/29 12:19:29
wh : 76800/76800(100.0%) : fin 2m 32.64s
frm : 300/300(100.0%) : fin 13h 2m 52.90s