角柱と角すいもAND,OR,XOR演算

前回のv49で、角柱と角すいで試したときの変な挙動を修正してみました。

結構根深い問題で、根本的に勘違いしてる箇所がありました。

例えば、球の表面の法線ベクトルは、中心から表面までのベクトルの方向にしてます。

アフィン変換で球をひしゃげさせたとしても、 法線ベクトルにも同じアフィン変換をかけて、ひしゃげさせて使ってます。

球は、おそらくこれで問題ないでしょう。

角すいの斜めな側面の平面について。

平面上の表面の法線ベクトルは、平面の法線の方向にしてます。

アフィン変換で角すいをひしゃげさせたとき、 球の時と同様に法線ベクトルにも同じアフィン変換をかけて、ひしゃげさせておりました。

              /
  .         /
    .     /
      . /
      /
    /
  /
/

つまり、こういう斜めの直線と、直行する法線ベクトルがあったとして 横方向に押しつぶすと

       /
 .    /
  .  /
   ./
   /
  /
 /
/

直行じゃなくなります。

       /
      /
..   /
  ../
   /
  /
 /
/

図がアレですが、押しつぶした後も直線に対して直行してほしいのです。

という理屈からすると、 円柱や円すいの側面も、例えば回転で斜めに倒してから上下に押しつぶすようなアフィン変換をかけると、 まずい気がします...

ですが、とりあえず、平面の場合だけ修正して試してみます。

v50.patch

$ mv rt_v49 rt_v50
$ cat v50.patch | ( cd rt_v50 ; patch -p1 )
$ cd rt_v50
$ make clean
$ make

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

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v50/objs_1_2_sc n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 3.03s
  以前の
  v48  wh : 76800/76800(100.0%) : fin 3.11s
  v47  wh : 76800/76800(100.0%) : fin 3.04s
  v45  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

まずはop2.yamlの円柱、円すいで

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op2.yaml data_name=all name=out_v50/op2ck fps=1
  :
wh : 307200/307200(100.0%) : fin 11.04s
frm : 20/20(100.0%) : fin 4m 32.99s
estimated 2.27 hour at 640*480 30fps

$ ls -lt out_v50/ | head
-rw-r--r--  1 kondoh  staff  668844  6 12 00:17 op2ck.mp4
-rw-r--r--  1 kondoh  staff   63314  6 12 00:17 op2ck00020.jpg
-rw-r--r--  1 kondoh  staff   67621  6 12 00:17 op2ck00019.jpg
-rw-r--r--  1 kondoh  staff   63586  6 12 00:17 op2ck00018.jpg
-rw-r--r--  1 kondoh  staff  101408  6 12 00:16 op2ck00017.jpg
-rw-r--r--  1 kondoh  staff   93465  6 12 00:16 op2ck00016.jpg
-rw-r--r--  1 kondoh  staff   73056  6 12 00:16 op2ck00015.jpg
-rw-r--r--  1 kondoh  staff   88722  6 12 00:16 op2ck00014.jpg
-rw-r--r--  1 kondoh  staff   50637  6 12 00:16 op2ck00013.jpg

大丈夫そうですね。

そしてop3.yamlの16角柱、16角柱すい

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op3.yaml data_name=all name=out_v50/op3
  :
wh : 289697/307200(94.3%) : total 21.32s : rest 1.21s : 2018/06/12 06:06:35
wh : 307200/307200(100.0%) : fin 20.15s
frm : 600/600(100.0%) : fin 5h 40m 58.89s

$ ls -lt out_v50/ | head
-rw-r--r--  1 kondoh  staff  1560496  6 12 06:08 op3_2.mp4
-rw-r--r--  1 kondoh  staff  3142729  6 12 06:08 op3_1.mp4
-rw-r--r--  1 kondoh  staff  5021109  6 12 06:06 op3.mp4
  :

5時間40分。OKです。

今回のパッチに、しれっと視点移動の箇所に変更というか、指定の追加を入れてみました。

物体の方でリサージュな動きをさせたときに、視点も合わせて追随しやすいかと。

コインのデータで試してみます。

最後尾のコインのさらに後ろに11個目のコインがある場合の位置に視点をもってきて、 最後尾のコインを目標にして視線を設定してみました。

ジェットコースターの後からの眺めを狙ってみましたが、はたして?

$ ./cg.py ep=[-20,-20,-20],[20,20,20],[3,4,5],-3 et=[-20,-20,-20],[20,20,20],[3,4,5],-2.7 sec=20 yaml=spin_coin.yaml data_name=all name=out_v50/coin
  :
wh : 290213/307200(94.5%) : total 9.08s : rest 0.50s : 2018/06/12 11:10:49
wh : 307200/307200(100.0%) : fin 8.62s
frm : 600/600(100.0%) : fin 1h 44m 44.07s

ls -lt out_v50/ | head
-rw-r--r--  1 kondoh  staff  3049291  6 12 11:11 coin_1.mp4
-rw-r--r--  1 kondoh  staff  3170370  6 12 11:10 coin.mp4
  :

1時間45分。
久々に、3Mバイトを超えてるけど、展開してまとめなおすと3Mバイトに収まるパターンでした。

ジェットコースター。激し過ぎて何が何やら、、、