先のデータの一部を拡大して配置して、再帰風にして試してみたところ...
$ cat dat4.yaml pillar: - kind: cube rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } m2g: [ ax.zoom_z(10) ] - kind: pipe rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } m2g: [ 'ax.zoom([2,2,1])', ax.slide_z(-11) ] rxs: - [ m2g, append, 2, [ ax.slide_z(22) ] ] big_ball: - kind: ball rtd: { diff: 0.3 } maps: - fn: IMG_3999_4.mov fn_r: IMG_3999_4.mov t2m: [ ax.zoom_all(2), ax.rot_x(90) ] - fn: IMG_3999_4.mov fn_r: IMG_3999_4.mov t2m: [ ax.zoom_all(2), ax.rot_x(90), ax.rot_z(180) ] m2g: [ ax.zoom_all(1000) ] colosseum: - kind: export export: pillar m2g: [ ax.slide_x(20) ] rxs: - [ m2g, append, 16, [ ax.rot_z(360.0/16) ] ] - kind: pipe rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } m2g: [ 'ax.zoom([24,24,1])', ax.slide_z(-13) ] rxs: - [ m2g, append, 2, [ ax.slide_z(26) ] ] all: - kind: export export: colosseum rxs: - [ m2g, append, 2, [ ax.zoom(6) ] ] - kind: ball rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } m2g: [ ax.zoom_all(6) ] - kind: export export: big_ball # EOF
$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/wf_ wf : frm : 599/600(99.8%) : total 57m 15.79s : rest 5.72s : 2018/06/01 17:11:39 frm : 600/600(100.0%) : fin 57m 15.88s (n, fps)=(600, 30.0) $ ls -lt out_v44/ | head -rw-r--r-- 1 kondoh staff 3016737 6 1 17:14 wf__3.mp4 -rw-r--r-- 1 kondoh staff 3144875 6 1 17:14 wf__2.mp4 -rw-r--r-- 1 kondoh staff 3140882 6 1 17:12 wf__1.mp4 -rw-r--r-- 1 kondoh staff 9270739 6 1 17:11 wf_.mp4 :
ん?
$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/all : wh : 307200/307200(100.0%) : fin 1m 20.94s frm : 600/600(100.0%) : fin 27h 47m 53.95s (n, fps)=(600, 30.0) : $ ls -lt out_v44/ | head -rw-r--r-- 1 kondoh staff 2207354 6 1 13:29 all_2.mp4 -rw-r--r-- 1 kondoh staff 3145411 6 1 13:29 all_1.mp4 -rw-r--r-- 1 kondoh staff 5764500 6 1 13:27 all.mp4 :
28時間ほどもかかったけど、やっぱり「ん?」
拡大した方の外側の「柱」の上下の円柱部分。 天井と床部の円柱部分の配置が意図した通りになってません。dat.py : def d_setup(d): : if 'rxs' in d: rxs = d.get('rxs') if not rxs: d.pop('rxs') return d_setup(d) (targ_k, i_a, n, lx) = rxs.pop(0) targ = d.get(targ_k, []) ds = [] for i in range(n): d_ = d_copy(d) d_[targ_k] = targ[:] ds.append(d_) targ = lx + targ if i_a == 'insert' else targ + lx return sum( map( d_setup, ds ), [] ) : if kind == 'export' and 'export' in d: data = ydic.get( d.get('export'), [] ) data = ut.map_lst( d_copy, data ) ds = [] for d_ in data: d_['m2g'] = d_.get('m2g', []) + d.get('l2g') ds += d_setup(d_) for d_ in ds: d_['maps'] = d_.get('maps', []) + d.get('maps', []) return ds :
この処理の順番に問題が。
dat4.yaml : all: - kind: export export: colosseum rxs: - [ m2g, append, 2, [ ax.zoom(6) ] ] :
例えばここの展開で、 先にrxsの拡大の結果がm2gの末尾に追加されて、 そのあとでexportの処理で、
colosseum: : - kind: pipe rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } m2g: [ 'ax.zoom([24,24,1])', ax.slide_z(-13) ] rxs: - [ m2g, append, 2, [ ax.slide_z(26) ] ] :
こちらの'm2g'。このzoomとslide_z。ここまではオッケー。export の
d_['m2g'] = d_.get('m2g', []) + d.get('l2g')
allのrxsのm2gに追加された拡大は、d.get('l2g') に反映されているので、 zoomとslide_zのm2gよりも後方に追加されます。
問題はそのあとd_['m2g'] = d_.get('m2g', []) + d.get('l2g') ds += d_setup(d_)
このd_setup(d)から
rxs: - [ m2g, append, 2, [ ax.slide_z(26) ] ]
が展開されて、m2gのさらに後ろ側に、このslize_z()が追加されます。
なんともややこしい...
そもそも、exportの展開を先に処理して、export元のrxs展開込みで済ませた状態で、 外側のrxsのコピー展開を処理するのが自然かと。
ということで、exportとrxsの処理順を入れ替えてみました。
そのままではダメ。一部rxs展開がうまく成されません。抜けがありました。 なかなか手強い。
以前の処理順では、exportの展開時にはrxsは展開済みの前提で、 データ中にrxsが現れる事はありませんでした。
処理順を変えたので、前提が崩れます。 exportの展開時でもrxsがあれば展開先に追加するように修正します。
$ mv rt_v43 rt_v44 $ cat v44.patch | ( cd rt_v44 ; patch -p1 ) $ cd rt_v44 $ make clean $ make
視点移動はちょっと引き気味にしてみます。
$ ./cg.py eyep=[0,0,0],[450,450,150],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/wf_tst wf fps=2 : frm : 39/40(97.5%) : total 3m 51.44s : rest 5.78s : 2018/06/03 05:26:49 frm : 40/40(100.0%) : fin 3m 51.59s estimated 0.96 hour at 640*480 30fps
円柱部分の配置OK
$ ./cg.py eyep=[0,0,0],[450,450,150],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/rough fps=4 div=8 : frm : 79/80(98.8%) : total 2m 22.23s : rest 1.77s : 2018/06/03 05:31:27 wh : 0/4800(0.0%) : not start yet wh : 4800/4800(100.0%) : fin 0.98s frm : 80/80(100.0%) : fin 2m 21.78s estimated 18.91 hour at 640*480 30fps
それでは19時間で。
$ ./cg.py eyep=[0,0,0],[450,450,150],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/fix : wh : 307200/307200(100.0%) : fin 1m 4.04s frm : 600/600(100.0%) : fin 18h 52m 12.35s (n, fps)=(600, 30.0) : ./v.mp4 315/600 $ ls -lt out_v44/ | head -rw-r--r-- 1 kondoh staff 2762196 6 4 00:31 fix_2.mp4 -rw-r--r-- 1 kondoh staff 3141307 6 4 00:31 fix_1.mp4 -rw-r--r-- 1 kondoh staff 6391237 6 4 00:29 fix.mp4 :
ほぼ19時間でした。
手前の大きな角柱の横切りが、あまりにチラチラするのでもう一丁。 dat5.yaml で試してみます。
$ diff -u dat4.yaml dat5.yaml --- dat4.yaml Sun Jun 3 04:12:50 2018 +++ dat5.yaml Mon Jun 4 04:58:05 2018 @@ -36,7 +36,7 @@ - kind: export export: colosseum rxs: - - [ m2g, append, 2, [ ax.zoom(6) ] ] + - [ m2g, append, 2, [ ax.zoom(16) ] ] - kind: ball rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } m2g: [ ax.zoom_all(6) ] $
外側の柱の拡大率をアップして、視点移動の引きも元に戻してみます。
$ wget http://kondoh2.html.xdomain.jp/rt/dat5.yaml $ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=dat5.yaml data_name=all name=out_v44/dat5 : wh : 290062/307200(94.4%) : total 1m 18.96s : rest 4.40s : 2018/06/05 02:43:04 wh : 307200/307200(100.0%) : fin 1m 14.59s frm : 600/600(100.0%) : fin 21h 35m 6.34s $ ls -lt out_v44/ | head -rw-r--r-- 1 kondoh staff 2559915 6 5 02:45 dat5_2.mp4 -rw-r--r-- 1 kondoh staff 3132526 6 5 02:45 dat5_1.mp4 -rw-r--r-- 1 kondoh staff 6155197 6 5 02:43 dat5.mp4 :
21時間半。 視点の開始位置と終了位置がちょうど、柱に埋まった位置になってました。