チェスボードの上に透明の球

繰り返しコピーができるようになったところで、 私が勝手に思い込んでいるレイトレーシングの伝統的なパターン 「チェスボードの上に透明の球」を再度試してみます。

v37.patch

$ mv rt_v36 rt_v37
$ cat v37.patch | ( cd rt_v37 ; patch -p1 )
$ cd rt_v37
$ make clean
$ make

物体の繰り返しコピー配置 では、 コピーを作る位置についてごたくを並べてたのですが、 バグがあり意図した動作になってませんでした。

物体データをコピーしても、データが指してるマッピング情報が、皆同じものを指していました。 コピーした最後のデータに行ったマッピングの処理が、 全部のコピーしたデータに影響してしまっておりました。

パッチの

dat.py
  :
 			d_ = d.copy()
 			d_['rxs'] = rxs[:] # !
 			d_[targ_k] = targ[:]
+			d_['maps'] = ut.map_lst( lambda m: m.copy(), d.get('maps') ) # !
 			ds.append(d_)
 			targ = lx + targ if i_a == 'insert' else targ + lx
 		return sum( map( d_setup, ds ), [] )
  :

この箇所で、マッピング情報もコピーするように修正しておきます。

今回のその他の変更

毎回、フルサイズで走らせたときの予想時間を手で計算してましたが、 荒削り設定のときに最後に表示するようにしてみました。

生成した動画ファイルが3Mバイトを超えてた場合、 適当に分割する処理を追加していみました。

では、いつもの速度確認。

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v37/objs_1_2_sc n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 15.49s

$ ./skill.sh
  以前の
  v36  wh : 76800/76800(100.0%) : fin 15.13s
  v35  wh : 76800/76800(100.0%) : fin 16.16s
  v34  wh : 76800/76800(100.0%) : fin 38.47s
  v32  wh : 76800/76800(100.0%) : fin 26.84s
  v31  wh : 76800/76800(100.0%) : fin 40.50s
  v30  wh : 76800/76800(100.0%) : fin 38.39s
  v29  wh : 76800/76800(100.0%) : fin 1m 44.72s
  v28  wh : 76800/76800(100.0%) : fin 1m 18.06s
  v27  wh : 76800/76800(100.0%) : fin 1m 8.39s
  v26  wh : 76800/76800(100.0%) : fin 1m 6.02s

まぁ同程度。

ではパッチに追加した「伝統パターン」をば。

  :
+rxs_check = [ {
+	'kind': 'square',
+	'rtd': { 'diff': 0.8 },
+	'maps': [ { 'fn': 'IMG_3999_3.mov', 'fn_r': 'IMG_3999_4.mov', 't2m': [ ax.zoom_all(4) ] } ],
+	'm2g': [ ax.slide([-8,-8,-2]) ],
+	'rxs': [
+		( 'm2g', 'insert', 2, [ ax.slide([2,2,0]) ] ),
+		( 'm2g', 'insert', 4, [ ax.slide_x(4) ] ),
+		( 'm2g', 'insert', 4, [ ax.slide_y(4) ] ),
+	]
+},{
+	'kind': 'ball',
+	'rtd': rtd,
+	'm2g': [ ax.zoom_all(2) ],
+} ]
+
+rxs_check2 = [ {
+	'kind': 'square',
+	'rtd': { 'diff': 0.8 },
+	'maps': [ { 'fn': 'IMG_3999_3.mov', 'fn_r': 'IMG_3999_4.mov', 't2m': [ ax.zoom_all(40) ] } ],
+	'l2m': [ ax.slide([-8,-8,-2]) ],
+	'rxs': [
+		( 'l2m', 'insert', 2, [ ax.slide([2,2,0]) ] ),
+		( 'l2m', 'insert', 4, [ ax.slide_x(4) ] ),
+		( 'l2m', 'insert', 4, [ ax.slide_y(4) ] ),
+	]
+},{
+	'kind': 'ball',
+	'rtd': rtd,
+	'm2g': [ ax.zoom_all(2) ],
+} ]

rxs_check はコピーする位置が画像を焼き付けた後、 rxs_check2 はコピーする位置が画像を焼き付ける前になってます。

前者のデータで、まずは荒削り設定で

$ ./cg.py eyep=[0,0,0],[40,40,10],10 sec=10 data_name=rxs_check name=out_v37/rxs_check_tst fps=10 div=4
  :
wh : 14959/19200(77.9%) : total 1.33s : rest 0.29s : 2018/05/12 17:29:50
wh : 19200/19200(100.0%) : fin 1.31s
frm : 100/100(100.0%) : fin 2m 20.23s
estimated 1.87 hour at 640*480 30fps

$ ls -lt out_v37/ | head
-rw-r--r--  1 kondoh  staff  887006  5 12 17:29 rxs_check_tst.mp4
  :

1.87時間の予想。いかに?

$ ./cg.py eyep=[0,0,0],[40,40,10],10 sec=10 data_name=rxs_check name=out_v37/rxs_check
  :
wh : 278581/307200(90.7%) : total 29.79s : rest 2.77s : 2018/05/12 20:32:56
wh : 307200/307200(100.0%) : fin 27.08s
frm : 300/300(100.0%) : fin 2h 33m 32.76s

$ ./skill.sh

$ ls -lt out_v37/ | head
-rw-r--r--  1 kondoh  staff  2994817  5 12 21:31 rxs_check_1.mp4
-rw-r--r--  1 kondoh  staff  3165126  5 12 20:32 rxs_check.mp4
  :

実際には2時間半でした。

生成した動画サイズが微妙に3Mを超えてたので、 自動的に3Mバイトに分割する処理が入りましたが、、、 展開してまとめなおしただけで、ファイルサイズが3M以内になったようです。

jpegで不可逆な圧縮をしてると、まぁそういう事もあるのかな。

続いて画像をマッピングする前にコピーする方式の場合。

$ ./cg.py eyep=[0,0,0],[40,40,10],10 sec=10 data_name=rxs_check2 name=out_v37/rxs_check2_tst fps=10 div=4
  :
wh : 15251/19200(79.4%) : total 1.31s : rest 0.27s : 2018/05/12 17:35:16
wh : 19200/19200(100.0%) : fin 1.32s
frm : 100/100(100.0%) : fin 2m 23.70s
estimated 1.92 hour at 640*480 30fps

$ ls -lt out_v37/ | head
-rw-r--r--  1 kondoh  staff  536321  5 12 17:35 rxs_check2_tst.mp4
  :

$ ./cg.py eyep=[0,0,0],[40,40,10],10 sec=10 data_name=rxs_check2 name=out_v37/rxs_check2
  :
wh : 278271/307200(90.6%) : total 28.55s : rest 2.68s : 2018/05/13 00:13:13
wh : 307200/307200(100.0%) : fin 25.93s
frm : 300/300(100.0%) : fin 2h 34m 43.47s

$ ./skill.sh

$ ls -lt out_v37/ | head
-rw-r--r--  1 kondoh  staff  1404207  5 13 00:13 rxs_check2.mp4
  :

こちらも予想時間を超えて2時間半程度でした。

ファイルサイズは1.5M弱。 こういう画像(?)だと、動画ファイルのサイズが小さくなるようです。

では、続きの10秒

$ ./cg.py eyep=[0,0,0],[40,40,10],10 sec=10 data_name=rxs_check2 name=out_v37/rxs_check2_2 init_sec=10
  :
wh : 270609/307200(88.1%) : total 17.28s : rest 2.05s : 2018/05/13 06:31:52
wh : 307200/307200(100.0%) : fin 15.30s
frm : 300/300(100.0%) : fin 2h 28m 55.50s

$ ./skill.sh

$ ls -l out_v37/ | head
-rw-r--r--  1 kondoh  staff  1182585  5 13 06:31 rxs_check2_2.mp4
  :

合わせて20秒に

$ rm -rf /tmp/img_wk/ttt
$ mkdir -p /tmp/img_wk/ttt
$ ./img.py /tmp/img_wk/ttt/a0 out_v37/rxs_check2.mp4 cmd=v2i
$ ./img.py /tmp/img_wk/ttt/a1 out_v37/rxs_check2_2.mp4 cmd=v2i
$ ./img.py /tmp/img_wk/ttt/a out_v37/rxs_check2_sum.mp4 cmd=i2v

$ ls -l out_v37/rxs_check2_sum.mp4 
-rw-r--r--  1 kondoh  staff  2348114  5 13 09:37 out_v37/rxs_check2_sum.mp4

20秒でも余裕でファイルサイズ3Mバイト以内でした。