2

ブレンダーから.objファイルにエクスポートされた法線と少し混乱しています.objファイルを2つのファイルに分割するwinアプリケーションを作成しています。1つは頂点で、もう1つはインデックスです。私が顔で見るように、私は同じ顔を見つけることができますが、たとえば顔24/24/20と再び24/24/19など、法線が異なります。これは正しいですか? Blenderプロジェクトには光源が1つしかありませんありがとう

4

2 に答える 2

4

私はいくつかのテストを行いました、そしてこれが私がこれらをどのように見るかです:

OBJエクスポートスクリプトは頂点法線を無視し、代わりに面法線を使用します。

テストするために、この画像のように2つの三角形でできた単純な形状を作成しました。

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

そしてOBJにエクスポートされます。4つのベクトルがあるため、4つのベクトル法線(vn)を期待する必要があります。中央の2つのベクトルは同じであるため、最適化されている場合は3つです。しかし、代わりに2つのvn-sのみを出力します。

vn -0.000000 1.000000 0.000000
vn -1.000000 -0.000000 -0.000000

さらに、顔の定義を見ると、もっと面白いものが見つかります。

f 1 // 1 4 // 1 3 // 1

f 4 // 2 2 // 2 3 // 2

単一行の//の後の数字を見てください。それらは同じです。これは、1つの面内のすべての頂点に対して同じ法線を使用することを意味します。つまり、これらは頂点の法線ではなく、面の法線です。したがって、これが同じ頂点に異なる法線を割り当てる理由です。頂点番号の場合 4は、最初の面が最初の面の法線を受け取ることを定義するために使用され、2番目の面を定義するために使用される場合、2番目の面の法線が使用されます。

編集 次のように、これらから頂点法線を計算できます。

  • 頂点のすべての出現を見つけて、そのすべての法線をセットAに入れます
  • 法線のそれぞれの座標を追加します:vn =(x1 + x2 + ... + xn、y1 + y2 + ... + yn、z1 + z2 + ... + zn)
  • ベクトルの長さを計算します:h = sqrt(vnx ^ 2 + vny ^ 2 + vnz ^ 2)
  • ベクトルvnを正規化する:vn =(vnx / h、vny / h、vnz / h)

前の例(画像にあるもの)を使用すると、上下のベクトルは1回だけ発生するため、何もする必要はありません(頂点の法線は顔の法線と同じです)。中央の頂点で:2回発生します。1回は上の三角形で、法線は(0、1、0)で、下の頂点では(-1、0、0)です。したがって、これらの頂点の法線のセットは{ (0、1、0)、(-1、0、0)}。これらを追加すると、(0-1、1 + 0、0 + 0)=(-1、1、0)になります。長さの計算:h = sqrt((-1)^ 2 + 1 ^ 2)= sqrt(2)。ベクトルをそれで割ると、norm(vn)= vn / h =(-1 / sqrt(2)、1 / sqrt(2)、0)が得られます。中央の法線でフロントオルソ(左上)の画像を見ると、-xと+ yの等しい成分があり、ベクトルの長さは1であることがわかります。結果の長さがわかります。 1もう一度長さを計算して:

于 2012-03-18T21:02:18.937 に答える