クォータービューの描画順の問題(4)

これなんかどう


任意の二つのキューブの前後関係(どちらを手前に描画すべきか)は比較的容易に決定できる。


ひとつ目のキューブ C1 の一番手前の頂点の座標を(x1,y1,z1),ふたつ目のキューブ C2 の一番手前の頂点の座標を(x2,y2,z2)とすれば、

1) x1 >= x2+1 ならば C1のほうが後方にある
2) y1 >= y2+1 ならば C1のほうが後方にある
3) z1 >= z2+1 ならば C1のほうが後方にある

4) x2 >= x1+1 ならば C2のほうが後方にある
5) y2 >= y1+1 ならば C2のほうが後方にある
6) z2 >= z1+1 ならば C2のほうが後方にある

↑のいずれの条件にも当てはまらないケースはない。
(キューブ同士が交差していない限りは)


ということで、これを比較条件としてsortすればいいんじゃないかということになる。


きちんと正しい描画順序になるZ-orderを求めるのはすごく難しいのに、前後関係を決する条件式を書くのは非常に簡単な問題だなぁ、と思うわけだ。(私も最初そう思った)


ところが、図のBとCのような位置関係にある場合、このsort条件だと上記の1)と5)あるいは2)と4)を同時に満たすことになる。これは前後関係をこの条件で正しく決定できていない証拠である。(とりあえずその場合は、キューブとキューブの前後関係として、この判定関数でイコールを返すようにするとしよう。)


このように前後関係を決定できないグループと、できるグループとがあることに気づく。


ということは、前後関係を決定できるグループに関しては、事前にソートしておくことが可能なので、描画順はtree構造にして、前後関係を決定できないグループを枝としてぶら下げようか、なんて話になる。(つづく)