角錐のたぐいはワイヤーフレームでは、 三角に展開されてそれらしく表示されてましたが、 レイトレーシングしてみると表示が乱れてました。
まず、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 メモ
$ 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