UniformedGrid実装

ousttrue2008-12-21

ようやくUniformedGridの実装に成功。
曖昧な理解では書けないことはないのだが
デバッグできないのであった。
UniformedGrid実装に考慮されるべき点で気づいたことをメモ。


まず、グリッドのサイズをどうやって決めるか。
今回は長辺を基準に何分割するかをパラメータでで渡しているだけ
でまだ考えていない。
自動化するとすれば、ひとつのグリッドに格納する要素数を決め打ち
してそこから計算する方法が考えられる。
けどこれは、
格納する要素がシーンに一様に散っているという仮定に基づくことになるか。


つぎは要素をどのグリッドに格納するかの判定。
今回はグリッドと要素のバウンディングボックスがオーバーラップするか
で決めてしまった。
もっと凝った方法だと
Separating Axis Theoremというのに基づいた
http://www.cs.lth.se/home/Tomas_Akenine_Moller/code/
が使えると思うのだが
グリッドの方が要素よりある程度以上大きいと仮定すれば
そこまでやる必要もないかも。
逆ならやるべきか。


最後がトラバース処理。
今回は、
http://www.cse.yorku.ca/~amana/research/

"A Fast Voxel Traversal Algorithm for Ray Tracing"
に書いてあるアルゴリズムを使わせてもらった。
3DDDAの一種らしい。
先にちゃんと読んで無かったので最後までバグに悩まされたが
さっき読み直したらすぐに理解できた。

bun_zipper_res4.plyでのテスト

vertices: 453
faceCount: 948
[-0.143147,-0.016380,-0.106644]-[0.108159,0.231897,0.107801]

1, 2, 4, 8, 16分割した時の結果

divided : 1, [1,1,1]
rendered time: 0.900000 sec
triangle intersection count: 18.442392 million(20.491549 million/sec)

divided : 2, [2,2,2]
rendered time: 1.020000 sec
// なんかおかしい
triangle intersection count: 20.846569 million(20.437815 million/sec)

divided : 4, [4,4,4]
rendered time: 0.640000 sec
triangle intersection count: 12.969087 million(20.264198 million/sec)

divided : 8, [8,8,7]
rendered time: 0.720000 sec
triangle intersection count: 14.162845 million(19.670618 million/sec)

divided : 16, [16,16,14]
rendered time: 0.930000 sec
triangle intersection count: 18.351334 million(19.732616 million/sec)

2分割の時の結果がちょっとおかしいのでそれはおいておくとして、
グリッドに分割することによって三角形交差の試行回数を減らすことができる。
でも分割しすぎると逆に試行回数が増加する。
4分割の時が処理時間も最小になった。
まだ、バグが残っていそうだ。

うさぎレンダリング成功

頂点を減らしていないうさぎのレンダリングに成功。
こつはモデルデータをスケールリングして巨大化することだったw

vertices: 35947
faceCount: 69451
store: bun_zipper.ply

bouding box: ([-9.518990,3.248740,-6.237360]-[6.150910,18.782101,5.929970])
divided : 10, [10,10,8]
rendered time: 0.130000 sec
sampling count: 22500
triangle intersection count: 2.582282 million(19.863708 million/sec)