デグレなおしときます(その2)

op2.yaml のデータで v51 と v58 を比べると、明らかに気泡が増えていました。

間のバージョンの画像も埋めてみます。

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op2.yaml data_name=all name=out_v5x/op2ck n=1
  :

同じ条件で画像を生成してみると...

v51

v52

v53

v54

v55

v56

v57

v58

とにかくv51からv52で劇的に気泡が増えてます。

その後v56からv57で平面系の気泡が激減。

その後は円すい側面に気になる気泡が残ったままと。

$ cat v52.patch
  :
--- rt_v51/cross.c	2018-06-14 01:04:12.000000000 +0900
+++ rt_v52/cross.c	2018-06-15 21:57:23.000000000 +0900
@@ -88,20 +88,15 @@
 
 	n = quadratic_formula(a, b, c, ts);
 
+	if(n == 0){
+		return 0;
+	}
 	if(ret->use_ts_only){
-		ret->ts_n = 0;
-		if(eq_d){
-			return ret->ts_n;
-		}
 		for(i=0; its[ ret->ts_n++ ] = ts[i];
 		}
 		return ret->ts_n;
 	}
  :

視線と物体の交点の算出で、物体どうしの演算系の場合で use_ts_only が真のときは、、、 v51までは eq_d のとき、つまり対象の物体に前回の交点があった場合、 無条件で交点なし。

て、ことは、、、 例えば視点から一度円すいの物体側面の表面にぶつかって、 その後その交点を新たな視点として、屈折して内部に視線を進行させるとき、 外側に出るために対面の側面にぶつかったとしても、 必ず交点なしと扱ってます。

なるほど、v51の画像、よく見ると屈折光の像が無い。

これはこれで処理に問題がありました。 v51で気泡が出てないのは、屈折光の処理がバグってたせいでした。

データのカットアンドトライで追い込んでみると、、、やはりどうも屈折光があやしいです。

rtdの設定で自発光(base)、拡散光(diff)、反射光(reflect)を0にして、屈折光(reflact)だけにしても、気泡が出ます。

屈折光でも密度(density)を1にすると、気泡の現象は出ません。

2枚の四角の平面を直角に配置しただけでも、気泡の現象は出てます。

この2枚の四角のデータでデバッグアウトを表示しやすいように、表示用の関数を ut.[ch]に追加して、 狙ったところだけ、交点の状態を表示してみると、、、

まず一方の平面にぶつかり、屈折光がもう一方の平面にぶつかります。

ここからの屈折光は、はるかかなたにスルーしていく場合が通常なのですが、、、そうでない場合がありました。

屈折光が、また最初の平面にぶつかり、その屈折光がもう一方の平面にぶつかり、、、

このピンポンの回数が、2回のときもあれば、3回のときもある。

何回かピンポンして、はるかかなたに出ていきます。

この出ていくときの方向が、ピンポンの回数によって、 あちこち向くので、最終的な色がコロコロかわって、気泡となって見えてます。

そして、このピンポン中は、交点の位置がほとんど動いてません。 新たな視点から交点までの距離も、ほぼ0付近でした。

ということは、平面の交差する直線上が交点となってるはず。

最初に平面にぶつかって、屈折光がその平面にほぼ水平に進み、もう一本の平面にぶつかる。 その交点は2つの平面の交差する位置であると。

あー、なんだか判ってきました。 スネルの法則の屈折の角度の処理だ。

rt.c reflact_v()

	v_mul(nv, ang_nv_eyev, cos_v);
	v_sub(eyev, cos_v, sin_v);
	if(ang_nv_eyev < 0){
		density = 1.0 / density;
	}
	v_mul(sin_v, density, r_sin_v);

	sin_len2 = dot( r_sin_v, r_sin_v );

	sin_len2 = sin_len2 < 1 ? sin_len2 : 1; /* ここ!!! */

	cos_len = sqrt( 1 - sin_len2 );
	v_mul(cos_v, cos_len / len1( cos_v ), r_cos_v);
	v_add(r_sin_v, r_cos_v, ret_v);
	unit(ret_v, ret_v);

問題は「ここ!!」です。

r_sin_v の長さが1を超えてたとき、1に丸めてます。 そうしないと、これから求めたい cos_len つまり 「屈折光の法線に直行する方向の成分の長さ」が、虚数になってしまうからです。

丸めるとどうなるか、 ある限界の入反角度を超えると、屈折光は全部平面に沿った平行な向きになります。

そしてその光は平面上から平面に平行に進み、交差してるもう一方の平面にぶつかると。

そもそも長さが虚数になってしまう向きの場合、トレースすべき光はどこから当たってるのか?

というか、そういう状況のトレースは考慮しなくてもいいのでは?

とりあえず、「ここ!!」で1に丸めてるの条件になったときは、 屈折光は「なし」ということにしてみます。

v60.patch

$ mv rt_v59 rt_v60
$ cat v60.patch | ( cd rt_v60 ; patch -p1 )
$ cd rt_v60
$ make clean
$ make

それではリテイク

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

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op3.yaml data_name=all name=out_v60/op3
  :
wh : 307200/307200(100.0%) : fin 15.92s
frm : 600/600(100.0%) : fin 4h 18m 54.85s

$ ls -lt out_v60/ | head
-rw-r--r--  1 kondoh  staff   237760  7 12 01:05 op3_2.mp4
-rw-r--r--  1 kondoh  staff  3142849  7 12 01:05 op3_1.mp4
-rw-r--r--  1 kondoh  staff  3591257  7 12 01:02 op3.mp4
  :

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

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op2.yaml data_name=all name=out_v60/op2
  :
wh : 307200/307200(100.0%) : fin 9.31s
frm : 600/600(100.0%) : fin 2h 2m 20.46s

$ ls -lt out_v60/ | head
-rw-r--r--  1 kondoh  staff   692809  7 12 04:49 op2_2.mp4
-rw-r--r--  1 kondoh  staff  3145302  7 12 04:49 op2_1.mp4
-rw-r--r--  1 kondoh  staff  4043059  7 12 04:46 op2.mp4
  :

球と立方体のAND,OR,XOR演算

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op.yaml data_name=all name=out_v60/op
  :
wh : 307200/307200(100.0%) : fin 17.72s
frm : 600/600(100.0%) : fin 3h 53m 30.05s

$ ls -lt out_v60/ | head
-rw-r--r--  1 kondoh  staff  2560908  7 12 11:01 op_2.mp4
-rw-r--r--  1 kondoh  staff  3142406  7 12 11:01 op_1.mp4
-rw-r--r--  1 kondoh  staff  6100632  7 12 10:59 op.mp4
  :

物体のAND演算

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=and.yaml data_name=all name=out_v60/and
  :
wh : 307200/307200(100.0%) : fin 12.41s
frm : 600/600(100.0%) : fin 2h 23m 49.08s

$ ls -lt out_v60/ | head
-rw-r--r--  1 kondoh  staff  1400177  7 12 22:11 and_2.mp4
-rw-r--r--  1 kondoh  staff  3138361  7 12 22:11 and_1.mp4
-rw-r--r--  1 kondoh  staff  4812840  7 12 22:08 and.mp4
  :

カットモデル

$ ./cg.py eyep=[0,0,0],[130,90,30],10 sec=20 yaml=cool_car_cut.yaml data_name=all name=out_v60/cut
  :
wh : 307200/307200(100.0%) : fin 23.42s
frm : 600/600(100.0%) : fin 14h 37m 20.56s

パックマンもどき(その3)

$ ./pac_dat.py
$ ( cd pac ; wget http://kondoh2.html.xdomain.jp/rt/pac.log )
$ ./pac_dat.py
$ ./cg.py eyep=[0,0,20],[50,50,10],20 sec=30 yaml=pac.yaml data_name=all name=out_v60/pac_tst3_ fps=0.2
  :

ふぁ?