デグレなおします

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

を試してみると、再びv49のときの変な表示に。

v50.patch で、とりあえず平面系を対応して、よしよしとなって

v51.patch で、円柱や円すいの側面の場合も対応したつもりでしたが、、、 ここで、円柱と円すいのデータ op2.yaml で試してて、 なんか、以前とどこが変わったか良く判りませんねーってなって、 そのままでした。

今、v51の状態に戻してみて改めて op3.yaml の角柱と角すいのデータを試してみると、 この時点でv49のダメな表示にデグレしてました。

v51.patch をひもといてみると、、、

--- rt_v50/cross.c	2018-06-11 23:11:26.000000000 +0900
+++ rt_v51/cross.c	2018-06-14 01:04:12.000000000 +0900
  :
@@ -352,15 +353,24 @@
 		break;
 	}
 
-	if(is_plane(kind_idx)){
-		struct line x, y;;
-		lstx_tr_line(l2g, L2G, &line_x1, &x);
-		lstx_tr_line(l2g, L2G, &line_y1, &y);
-		cross_product_unit(x.v, y.v, ret->l_nv_g.v);
-		lstx_tr_p(l2g, L2G, ret->p, ret->l_nv_g.p);
-	}else{
-		line_new(&l_nv, ret->p, nv);
-		lstx_tr_line(l2g, L2G, &l_nv, &ret->l_nv_g);
+	line_new(&l_nv, ret->p, nv);
+	lstx_tr_line(l2g, L2G, &l_nv, &ret->l_nv_g);
+	if(kind_idx != KIND_BALL){
+		double *p = ret->l_nv_g.p;
+		double *v = ret->l_nv_g.v;
+		double z[3];
+		struct vecs vs;
+	
+		if(is_plane(kind_idx)){
+			v_set(z, v_x1);
+		}else if(kind_idx == KIND_PIPE_SIDE){
+			v_add(p, v_z1, z);
+		}else{ /* KIND_CONE_SIDE */
+			v_set(z, v_z1);
+		}
+		lstx_tr_p(l2g, L2G, z, z);
+		v_sub(z, p, z);
+		vecs_by_fix_ref(&vs, 'z', z, 'y', v);
 	}
 
 	if(rev){

ローカル変数 vs に、せっせと直行する3つのベクトルの座標系をこしらえておきながら、 力尽きたのか、そのままローカル変数 vs のスコープから外れてます。

しかもパッチの末尾

  :
diff -urN rt_v50/vecs.c rt_v51/vecs.c
--- rt_v50/vecs.c	2018-04-13 20:24:38.000000000 +0900
+++ rt_v51/vecs.c	2018-06-14 01:15:00.000000000 +0900
@@ -235,4 +235,12 @@
 	vecs_init(vs);
 }
 
+double *
+vecs_get_by_name(struct vecs *vs, char name)
+{
+	/* name: 'x', 'y' or 'z' */
+	int i = name - 'x';
+	return &VECS_ACC(vs, i, 0);
+}
+
 /* EOF */
diff -urN rt_v50/vecs.h rt_v51/vecs.h
--- rt_v50/vecs.h	2018-04-29 17:18:38.000000000 +0900
+++ rt_v51/vecs.h	2018-06-14 01:15:00.000000000 +0900
@@ -40,5 +40,6 @@
 
 void vecs_by_fix_ref(struct vecs *vs, char fix_nm, double *fix, char ref_nm, double *ref);
 void vecs_rot_y(struct vecs *vs, double deg);
+double *vecs_get_by_name(struct vecs *vs, char name);
 
 #endif

ローカル変数の vs から、判り易く目的のベクトルを取り出せるように関数を追加までしたのに、 この追加した関数はここまで、どこにも使われてませんでした。 残念ー。

cross.c
cross_get_nv()
  :
		vecs_by_fix_ref(&vs, 'z', z, 'y', v);
		v_set( v, vecs_get_by_name(&vs, 'y') ); /* これ */
	}
  :

遅ればせながら追加してパッチに含めておきます。

にしても、op3.yaml の角柱、角すい、op2.yaml の円柱、円すい。 試してみると気泡が目立ちます。こんなに出てたのだろうか?

少なくともv51のときのop2.yamlの画像では、無かったはず。 ちょっとv58で1コマだけ生成してみます。

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

まずv58

そして以前のv51

明らかにv58は気泡が増えてますな。

また見ていくとして、、、

とりあえず、まぁv51以降は法線の算出結果を最後にセットするのを忘れてたので、その確認を。

op2.yaml, op3.yamlで試してみると、ダメです。 角すいが、ちゃんと表示されてませんし、 明らかに反射で映り込む動画の画像が、歪みまくっていて法線があちこち向いてます。

(これはこれで、芸術的な画像かも)

cross.c cross_get_nv() のball以外の法線の箇所、見直してみるとかなり間違ってました。 修正しておきます。

今回はこれで一旦これでパッチを作成します。

v59.patch

$ mv rt_v58 rt_v59
$ cat v59.patch | ( cd rt_v59 ; patch -p1 )
$ cd rt_v59
$ make clean
$ make

まずは角すいの表示の確認。

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op3.yaml data_name=all name=out_v59/op3_tst fps=1
  :
wh : 307200/307200(100.0%) : fin 39.27s
frm : 20/20(100.0%) : fin 12m 4.64s
estimated 6.04 hour at 640*480 30fps

op2.yaml も同様に。

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

こちらは物体数が少ないので、計算時間は短いですね。

気泡が気になりますが、とりあえず「平面系」の法線が正しくなって、角すいの「形状」はv50レベルに戻りました。

それではリテイク

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

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op3.yaml data_name=all name=out_v59/op3
  :
wh : 307200/307200(100.0%) : fin 20.66s
frm : 600/600(100.0%) : fin 5h 50m 36.83s

$ ls -lt out_v59/ | head
-rw-r--r--  1 kondoh  staff  2936307  7  6 10:20 op3_2.mp4
-rw-r--r--  1 kondoh  staff  3136221  7  6 10:20 op3_1.mp4
-rw-r--r--  1 kondoh  staff  6446809  7  6 10:18 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_v59/op2
  :
wh : 307200/307200(100.0%) : fin 9.93s
frm : 600/600(100.0%) : fin 2h 20m 5.13s

$ ls -lt out_v59/ | head
-rw-r--r--  1 kondoh  staff  2571436  7  6 23:28 op2_2.mp4
-rw-r--r--  1 kondoh  staff  3139436  7  6 23:28 op2_1.mp4
-rw-r--r--  1 kondoh  staff  6080015  7  6 23:26 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_v59/op
  :
wh : 307200/307200(100.0%) : fin 21.65s
frm : 600/600(100.0%) : fin 5h 9m 35.58s

$ ls -lt out_v59/ | head
-rw-r--r--  1 kondoh  staff   2959806  7  7 05:03 op_3.mp4
-rw-r--r--  1 kondoh  staff   3136246  7  7 05:03 op_2.mp4
-rw-r--r--  1 kondoh  staff   3129803  7  7 05:02 op_1.mp4
-rw-r--r--  1 kondoh  staff  10165325  7  7 05:00 op.mp4
  :

物体のAND演算

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=and.yaml data_name=all name=out_v59/and
  :
wh : 307200/307200(100.0%) : fin 14.23s
frm : 600/600(100.0%) : fin 3h 9m 42.58s

$ ls -lt out_v59/ | head
-rw-r--r--  1 kondoh  staff  2599890  7  7 14:30 and_3.mp4
-rw-r--r--  1 kondoh  staff  3137690  7  7 14:30 and_2.mp4
-rw-r--r--  1 kondoh  staff  3132393  7  7 14:28 and_1.mp4
-rw-r--r--  1 kondoh  staff  9716157  7  7 14:27 and.mp4
  :