3

頂点法線に少し問題があります。

結果は少し奇妙に思えます。まず画像を見てください:

3D ソフトウェアのオリジナル モデル。

OBJ ファイルから直接インポートされたメッシュを使用したフラグメント単位のライティング (ファイルの法線を使用)。

フラグメントごとの照明、独自のルーチンで法線を計算します。

気づきましたか?OBJ ファイルの法線を使用すると、すべて問題ありません。しかし、独自のルーチンを使用して頂点に基づいて法線を計算すると、何かがおかしいように見えます。

Z が負になると、法線が奇妙に見えます (右手の向きを使用)。オブジェクトの他の部分ではすべて問題ありませんが、メッシュを横切る 1 本の架空の線だけが奇妙に見えます。この問題は他のメッシュでも持続し、常に同じ場所 (Z = 0) にあります。

法線を計算する私のルーチンは、頂点 ABC を持つ三角形を想定して、誰もが知っているものです。

vec3 normal = normalize(cross(C - A, B - A));

そして、通常の結果を、既に計算された通常のバッファに追加します。

各三角形の面積を計算し、それを法線で乗算するか、バッファの法線と新しい法線の間の内積をチェックすることについて何人かの人が言っているのを見てきましたが、私はすでにそれらのアプローチを試しました。少し変更しますが、それでも同じ問題があります。

前にこれを見たことがありますか?それを解決する方法を知っていますか?

ここにいくつかのコードがあります:

// Looping at each triangle
vec3 distBA = vec3Subtract(vB, vA);
vec3 distCA = vec3Subtract(vC, vA);

vec3 normal = vec3Cross(distBA, distCA);

// Each normalBuffer represents one vertex.
normalBuffer[i1] = vec3Add(normal, normalBuffer[i1]);
normalBuffer[i2] = vec3Add(normal, normalBuffer[i2]);
normalBuffer[i3] = vec3Add(normal, normalBuffer[i3]);

// After pass through all faces/triangles.

// Looping at each Vertex structure.
normal = vec3Normalize(normalBuffer[i]);
4

2 に答える 2

1

フラグメントごとの照明をどのように計算するかによって (つまり、内積を 0 ~ 1 の範囲に固定するかどうか)、表示されるのは逆法線の問題である可能性があります。AB、の選択方法に応じてC、頂点の法線がいずれかの方向を指す場合があります。三角形の外側と内側を見分けるには、通常、頂点の曲がりなど、さらに情報が必要です。これを考慮していますか?

于 2011-04-14T14:56:27.483 に答える
0

「そして、通常の結果を既に計算された通常のバッファに追加します。」の結果を正規化していますか。必要かどうかはわかりませんが、追加しても問題ありません。そして、あなたがそれに取り組んでいる間に、NaN と無限大をチェックしてください。

入ってくるベクトルの長さが 0 より大きい場合、正規化関数をチェックインしますか?

特に問題は Z 軸でのみ発生するため、ベクトル ライブラリのどこかに厄介なバグがあるのではないかと疑っています。

于 2011-04-13T17:20:57.940 に答える