Appelの隠線消去アルゴリズムの等高線を見つける方法


10

楽しみのために、DCPU-16のワイヤーフレームビューアーを作成しようとしています。ワイヤーフレームで非表示になっている線を非表示にする方法を除いて、すべての方法を理解しています。SOに関するすべての質問は、OpenGLへのアクセス権があることを前提としていますが、残念ながら、DCPU-16(またはあらゆる種類のハードウェアアクセラレーション)のようなものにはアクセスできません。

GoogleブックスでAppelのアルゴリズムについてかなり良い説明を見つけました。しかし、私が理解するのに苦労している1つの問題があります。

Appelは、前面と背面のポリゴンで共有されるエッジ、または閉じた多面体の一部ではない前面のポリゴンの共有されていないエッジとして輪郭線を定義しました。2つの前面ポリゴンで共有されるエッジは、可視性に変化を与えないため、等高線ではありません。図8.4では、エッジAB、EF、PC、GK、CHは等高線ですが、エッジED、DC、GIは等高線ではありません。

図8.4

アルゴリズムのルールと、等高線が作成された後のアルゴリズムのしくみを理解していますが、エッジが「前向きポリゴンと後ろ向きポリゴンで共有されているかどうかを判断するために何をする必要があるかわかりません。コーディングの観点からは、閉じた多面体の一部ではない、正面を向いたポリゴンの共有されていないエッジ。私は形状を見ることができ、頭の中でどの線が等高線であるかを知ることができますが、その「理解」をコード化されたアルゴリズムに転送する方法についての手がかりはありません。


更新

等高線の決定にある程度の進歩がありました。コンピューターグラフィックスに関するバッファロー大学のクラスからのこれら 2つの講義ノートを見つけました。

ここに画像の説明を入力してください

エッジを考慮してください。これらは3つのカテゴリに分類されます。

  1. 2つの見えない面をつなぐエッジは、それ自体は見えません。これはリストから削除され、無視されます。
  2. 表示される可能性のある2つの面をつなぐエッジは「マテリアルエッジ」と呼ばれ、さらに処理する必要があります。
  3. 表示される可能性のある面と表示されない面を結ぶエッジは、「マテリアルエッジ」の特別なケースであり、「輪郭エッジ」とも呼ばれます。

上記の2つの情報を使用すると、これをコードとして書き出すことができるようになりますが、まだ長い道のりがあります。



1
三角形の法線を計算するときにこの答えを確認してください。法線ベクトルと見通しベクトルとのドット積は、三角形が正面を向いているかどうかを決定します。

回答:


3

「-facing」ルールを適用するには、すべての面が適切な方向を向いていることを確認する必要があります。たとえば、右手の法則を使用します。これは、面の頂点に、面の平面での正の回転が多面体の外側の法線方向に対応するように番号を付ける必要があることを意味します。(それを手に入れましたか?)またはもっと簡単に言えば、すべての顔はその外向きの法線で来る必要があります。

ぶら下がっている面、つまり閉じた多面体に属していない面は、不定の方向を持つと見なすことができます。

ここで、輪郭ポリゴンによって隠されているエッジの部分を計算することがメインコースです。この問題は、2Dのポリゴンウィンドウによるラインセグメントのクリッピングの問題に非常に近いものです。最初にラインセグメントのサポートラインを検討し、ポリゴンとの交点を見つけます。パリティルールを使用すると、ポリゴンの内側と外側のパーツを簡単に特定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.