物体を動かす

そろそろ物体を動かしてみます。

一旦効率は無視。 時刻とともに ax.xxx() のアフィン変換のパラメータを変化出来るようにして、 時刻の更新ごとにデータをyamlファイルのロードからやりなおします。

元々yamlファイル中のax.xxx()箇所は全て文字列として扱っていて、 ロード後にeval()でアフィン変換のオブジェクトを生成してます。

ソースコード中のeval()の箇所で変数secの時刻を用意しておけば、 文字列中でsecを参照する式が利用できるはずです。 (ああ、インタープリタは便利)

さすがに、以前の静止したyamlファイルのデータを使うときに、 フレーム毎に同じデータをロードしなおすのも何なので、 安易にyamlファイル中に単語 sec が含まれているかどうかで判定するようにしておきます。

v45.patch

$ mv rt_v44 rt_v45
$ cat v45.patch | ( cd rt_v45 ; patch -p1 )
$ cd rt_v45
$ make clean
$ make

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

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v45/objs_1_2_sc n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 3.00s
  以前の
  v43  wh : 76800/76800(100.0%) : fin 2.96s
  v42  wh : 76800/76800(100.0%) : fin 3.16s
  v39  wh : 76800/76800(100.0%) : fin 15.37s
  v38  wh : 76800/76800(100.0%) : fin 15.09s
  v37  wh : 76800/76800(100.0%) : fin 15.49s
  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

追加したdat6.yaml

$ diff -u dat5.yaml dat6.yaml
--- dat5.yaml	2018-06-04 04:58:05.000000000 +0900
+++ dat6.yaml	2018-06-04 23:11:09.000000000 +0900
@@ -1,7 +1,7 @@
 pillar:
 - kind: cube
   rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 }
-  m2g: [ ax.zoom_z(10) ]
+  m2g: [ 'ax.zoom_z( way.get([(10,2),(1,2)], sec, True) )' ]
 - 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) ]
@@ -28,7 +28,7 @@
   - [ 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) ]
+  m2g: [ 'ax.zoom([24, way.get([(24,4),(1,4)], sec, True), 1])', ax.slide_z(-13) ]
   rxs:
   - [ m2g, append, 2, [ ax.slide_z(26) ] ]
 
@@ -39,6 +39,7 @@
   - [ m2g, append, 2, [ ax.zoom(16) ] ]
 - kind: ball
   rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 }
+  l2m: [ 'ax.slide( way.liss([-3,-3,-3],[3,3,3],[3,4,5])(sec) )' ]
   m2g: [ ax.zoom_all(6) ]
 - kind: export
   export: big_ball

角柱の高さを2秒間隔で伸び縮み、 天井と床の円柱を4秒間隔でひしゃげさせて、 中央の球(6倍に拡大する前の半径1の段階)を(-3,-3,-3)から(3,3,3)の範囲を、 (3,4,5)秒の周期で適当にリサージュ図形の軌跡で移動させてみます。

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=dat6.yaml data_name=all name=out_v45/dat6_tst div=8 fps=8
  :
wh : 4800/4800(100.0%) : fin 1.11s
frm : 160/160(100.0%) : fin 4m 57.65s
estimated 19.84 hour at 640*480 30fps

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=dat6.yaml data_name=all name=out_v45/dat6
  :
wh : 291116/307200(94.8%) : total 1m 20.21s : rest 4.19s : 2018/06/05 20:15:31
wh : 307200/307200(100.0%) : fin 1m 16.05s
frm : 600/600(100.0%) : fin 14h 7m 18.73s

$ ls -lt out_v45/ | head
-rw-r--r--  1 kondoh  staff  3047631  6  5 20:17 dat6_2.mp4
-rw-r--r--  1 kondoh  staff  3144862  6  5 20:17 dat6_1.mp4
-rw-r--r--  1 kondoh  staff  6587792  6  5 20:15 dat6.mp4

14時間ほどでした。 確かに、ねらい通り動いてます。