球や立方体などの単純な物体ですが、 アフィン変換で並行移動、拡大縮小、回転などできます。
でも、もうちょっと複雑な図形を表示してみたいところ、、、
複数の物体の領域のAND、つまり論理積というか「かつ」な領域を表示してみます。
視線の直線と物体の表面との交点を求めるのが、レイトレーシングの基本ですが、 そこからもうちょっと頑張って、視線の直線を物体にぶすりと串刺しにしてみます。
おのおのの単純な物体に、視線という名の串を突き刺して、串に物体の内部の範囲の印をつけていきます。
範囲の印のついた串を束ねてANDをとって、全ての串に存在してる領域を割り出します。 視線の裏側の部分は除外して、一番手前にぶちあたる領域の開始位置、あるいは終了位置から交点を算出します。
(夜中に目をこすりながらデバッグして文章を書いてるので、 コードも文章もかなりとっちらかってしまいました...)
なんとかANDが出来たので、NOTも少し手を出してみましたが、 平面に展開される系の物体は未だ完成できず...
とりあえず球のNOTだけは確認できました。
$ 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