物体のAND演算

球や立方体などの単純な物体ですが、 アフィン変換で並行移動、拡大縮小、回転などできます。

でも、もうちょっと複雑な図形を表示してみたいところ、、、

複数の物体の領域のAND、つまり論理積というか「かつ」な領域を表示してみます。

視線の直線と物体の表面との交点を求めるのが、レイトレーシングの基本ですが、 そこからもうちょっと頑張って、視線の直線を物体にぶすりと串刺しにしてみます。

おのおのの単純な物体に、視線という名の串を突き刺して、串に物体の内部の範囲の印をつけていきます。

範囲の印のついた串を束ねてANDをとって、全ての串に存在してる領域を割り出します。 視線の裏側の部分は除外して、一番手前にぶちあたる領域の開始位置、あるいは終了位置から交点を算出します。

(夜中に目をこすりながらデバッグして文章を書いてるので、 コードも文章もかなりとっちらかってしまいました...)

なんとかANDが出来たので、NOTも少し手を出してみましたが、 平面に展開される系の物体は未だ完成できず...

とりあえず球のNOTだけは確認できました。

v47.patch

$ mv rt_v46 rt_v47
$ cat v47.patch | ( cd rt_v47 ; patch -p1 )
$ cd rt_v47
$ make clean
$ make

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

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v47/objs_1_2_sc n=1 init_sec=5 div=2
  :
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

まぁ、AND指定のデータじゃないのでさほど変わらず。

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=and.yaml data_name=all name=out_v47/and_wf div=8 fps=8 wf
  :
frm : 160/160(100.0%) : fin 32.02s
estimated 2.13 hour at 640*480 30fps

ワイヤーフレームはAND未対応です。 単に球と立方体が並んでるだけです。

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=and.yaml data_name=all name=out_v47/and_tst div=8 fps=8
  :
wh : 4800/4800(100.0%) : fin 0.10s
frm : 160/160(100.0%) : fin 33.08s
estimated 2.21 hour at 640*480 30fps

そう、これ。

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=and.yaml data_name=all name=out_v47/and
  :

残念。メモリリークで落ちてました。 デバッグ前に、ディスクに残っている画像をできるだけ救済しておきます。

$ ./img.py out_v47/and out_v47/and_ng