2011-07-17 3 views
4

地図上の建物のベクトルデータがあり、既知の高さに応じて押し出されて表示されます。擬似3D建物を視覚的に重ならないように並べ替え/描画する方法

私はこれが一般的な作業であることは知っていますが、私は満足のいく解決策を見いだせませんでした。

mapnikで実現されたことは、ポリゴン内のすべての頂点の最小Yで簡単なソートを使用しています。結果として、ほとんどが正しく描画されますが、一部は重複しています(約2〜3%)。多くの場合

Buildings overlap if sorted just by minimum Y

それだけで(上記の場合のために、この配列は3-2-1だろう)(何とか?)もbuldingsをソートし、適切な順序でそれらを引くには十分です。

もっと複雑なケースでは、ポリゴンが凹形で互いに接近しすぎると、すべての壁とキャップ(屋根)を別々に描画する必要があります(下記参照)。 UPDATED

enter image description here

:壁やキャップ:

をので、描画する線分の2種類があります。ウォールセグメントは注文するのが簡単です(最小Yで)。私はキャップを注文する方法を理解できません。

ありがとうございます。

+0

建物を常に上から見ている場合、帽子は常に壁の前にはありませんか?大文字と小文字が同じ高さにある場合、重なり合ってはいけません。 – Alan

+0

@Alanいいえ、一般的には高さが違うので、簡単です。 –

+0

ああ、高さの異なる建物があれば、物事が変わります。一般的な場合の解決策は、zバッファリングを使用することです。 – Alan

答えて

2

ストレートウォールの場合、深さでソートするのは簡単です。直線部分である基底だけを考えてみましょう。各行は平面を2つの部分に分割し、そのうちの1つはビューアに近く、もう1つは遠くにあることに注意してください。いずれのセグメントAについても、より近い部分A +およびより遠い部分A-を呼び出す。今、任意の二つのセグメントAおよびBのために、命題の少なくとも一方が成立:

  1. Aは完全にB-
  2. Bは
  3. A-
  4. に完全にある位置B +
  5. Aに完全にありますBは+
  6. つのセグメントは、視線に平行であり、他方は左にまたは完全
  7. AとBが交差
  8. それの右側に完全にあるAに完全に位置

ケース1と3では、BはAより前に描画する必要があります(AはAを閉塞しますが、BはAを閉塞することはできません)。 (2)および(4)の場合はBの前にA;ケース5の場合は問題ありません。通常の壁面では6が発生しません。

これで、トポロジカルな種類の壁を作成し、最も遠いものから最も近いものまで描画できます。

屋根については、屋根の一部が同じ屋根の別の部分を覆い隠す壁によって覆い隠される可能性があるため、凹型建物では不可能です。その中央から背の高いU字型の建物を見てください。塔はU字屋根に覆い隠されていますので、どのような順序で描いても構いません。違う。

凹型屋根を凸多角形に細分する必要があります。それで、同じ原則に沿って壁と一緒に並べ替えるのは簡単なはずです。

もう1つの方法は、Zバッファを使用することです。これにより、Zバッファが使用され、その順序について考えることができなくなります。最近、低消費電力の携帯電話用グラフィックカードの中でZバッファを使用できるというのは私の印象です。

+0

屋根の解体について明確にしても、依然としてアルゴリズムを理解しようとしてくれてありがとう。後で(直線の壁の場合)、より低い点の壁だけを描くべきではないか? –

+0

私はこれまでの前提をテストしましたが、正しくはありません。しかし、私はあなたが「Aが完全にB +にある」と言っていることを正確に比較しているものは得られませんでしたか?そのような気づきがないのは残念です。私はあなたが正しいと感じますが、あなたのところに到達することはできません。 –

+1

直線Aは、グランドプレーンを2つのハーフプレーンで分割します。視聴者が南から北に直接見えるとします。壁が子午線に沿って進む場合、A +またはA-ハーフプレーンはなく、左右のハーフプレーンのみ(ケース5)はありません。他のすべての場合には、我々がA +と呼ぶ「より南部の」ハーフプレーン(壁によって隠されていない)と、A +と呼ばれる「より北の」(部分的に壁によって隠されている) –

関連する問題