クォータービューの描画順の問題(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構造にして、前後関係を決定できないグループを枝としてぶら下げようか、なんて話になる。(つづく)