2012-03-02 26 views

答えて

2

(三角形)すべての顔のための法線を計算し、どこかに保存します。現在、すべての頂点について、頂点を共有するいくつかの面があります(典型的な6面)。最終的な頂点の法線は、面の法線の平均です。 6つの顔のために、あなたが計算します。このような配列でfaceNormalsを入れないでください:

int faceCount = 6; 
float sum = 0.0f; 
for(int face = 0; face < faceCount; ++face) 
    sum += faceNormals[face].x; 
normal.x = sum/faceCount; 
// and so on for y and z 

をその長さは1

NOTEあるように、得られたベクターを正規化することを忘れないでください。実際のコードでは、すべての法線の単一のvectorコンテナと、どの法線がどの頂点に関連するかを示すロジックが必要です。シリンダーリング上のすべての点については

+0

これは実際には機能しますか?私のテストのために、それは動作しないようです...これは私がしたものです: 'normal.x =(V1.x + V2.x + V3.x)/ 3.0f'(三角形のために)そして、私は最後に正規化しました。どうしたんだ? – Rookie

+0

@Rookieこれは頂点から三角形ノーマルを計算するための公式ではありません。このためには、[クロスプロダクト](http://en.wikipedia.org/wiki/Cross_product)が必要です。私の答えはいくつかの法線ベクトルを平均化することです。 – Fiktik

+0

申し訳ありませんが、私はOPを理解するので、ノーマルを計算する方法ではなく、滑らかな法線を計算する方法を尋ねるので、私は誤解しました。 – Rookie

3

vertexNormal = normalize(vertexPosition - ringCenter);

または通常はこの頂点を含むすべての顔のためのすべての面の法線の正規化された和である場合、あなたは、通常、それらを計算することができます。

+1

上記の数式を使用して頂点を作成するのと同時に、頂点ごとに1つの法線を作成します。これは説明されているようにシリンダーで動作します。 –

関連する問題