1

I'm trying to detect the silhouette edge of a 3d object. I know that you must first determine weather a face is looking at a position then find the edges that are shared between front and back facing.

I've been able to figure out front and back facing things but I can't figure out how to find if the edges are being shared without a lot of if statements. My vertex data is stored from x1,z1,y1,x2,z2,y2,x3,z3,y3 for every polygon.

4

2 に答える 2

1

2つの線分が同じ線上にあるかどうかを判断する方法を尋ねている場合は、ユークリッド幾何学を少し使用できます。いくつかの定義をカバーしましょう:

Aは(a1, a2, ..., an)実数のnタプルです。3Dの場合、n=3

点Aと実数のスカラー乗法tは次のように定義されます。

tA = (t*a1, t*a2, ..., t*an)

これらの2つのアイデアにより、線を非常に簡単に表すことができます。2点Aとの場合、方程式を満たすBP

P = tA + (1-t)B

は実数の行ABにあります。t

のとき0 <= t <= 1Pの間にAありB、のP=Aときt=1とのP=Bときt=0

これをプログラミングの観点に置くために、2つのクラスを作成できます:PointLine。上記の式を使用すると、が特定のにあるかどうかを判断するのは非常に簡単PointですLine。2つの線分が同じ線上にあるかどうかを判断するには、Point一方を定義する2つを使用しLineて、それらがもう一方にあるかどうかを確認しますLine

于 2013-02-17T23:18:53.667 に答える
0

2 つの線分が同じ線である場合

2 つの線分が同じポイント座標または同じポイント インデックスを使用している場合、これらの線分は同じです。それらが同じ線上にあるかどうかをテストすることは、シルエットを見つけるために解決する必要のないまったく別の問題です。

  1. インデックス付きプリミティブを使用します。
  2. モデルの読み込み中に、事前にエッジと必要なトポロジ テーブルのリストを事前に計算します。
  3. シャドウを描画しようとしている場合は、代わりにシャドウマップを使用してください。シャドウマップの方が理解しやすいです。

インデックス付きプリミティブとは、
1. すべての点を配列 (std::vector<vector3> points;または同様のもの、vector3xyz 座標を格納するデータ型) に格納し、すべての点が一意であることを意味します。
2. 面とエッジは、整数ポイント インデックスを使用してポイントを参照します。

いえ

struct Vec3{
    float x, y, z;
};

typedef unsigned int Index;

struct Face{
    enum{vertsPerFace=3};
    Index verts[vertsPerFace];
};

struct Edge{
    enum{vertsPerEdge=2};
    Index verts[vertsPerEdge];
};

std::set std::mapモデルをロードするときは、ポイントのリストを作成し、すべての面をまたは同様の構造を使用してインデックス付きプリミティブに変換します。プリミティブにインデックスを付けると、(std::map を使用して) 関連付けられたテーブルを構築できます。これにより、エッジがフェイスのリストにstd::multimap<std::pair<Index, Index>, FaceIndex>マップされ、エッジがそれらのエッジを使用するフェイス インデックスにマップstd::map<std::pair<VertexIndex, VertexIndex>, FaceIndex>されます。

于 2013-02-18T01:46:29.157 に答える