5

マーチングキューブアルゴリズムを使用して、グーローシェーディングを使用して(volvis.orgの)3Dモデルをレンダリングしようとしています。これまでのところ、各頂点の法線は次のようになっています。

GetNormalForVertex(vertex &b, vertex &a, vertex &c) {
    u.X = a.X - b.X;
    u.Y = a.Y - b.Y;
    u.Z = a.Z - b.Z;
    v.X = c.X - b.X;
    v.Y = c.Y - b.Y;
    v.Z = c.Z - b.Z;

    return  Cross(u,v);
}

レンダリングすると、フラットなシェーディングが見られます。さて、私が知る限り、これらの頂点法線を補間して、グーローシェーディングを取得するために交点で法線を見つける必要があります。頂点法線をどのように補間できますか?

4

2 に答える 2

11

まず第一に、あなたは頂点法線を計算していません。顔の法線を計算しています。これは、頂点法線を計算するプロセスのステップ1です。

次のステップは何も補間しません。頂点にアタッチされた各面の(正規化されていない)面法線を計算します。次に、それらをすべて一緒に追加し、結果を正規化します。これが頂点法線です。

どの面が頂点にアタッチされているかをどのように決定するかは別の問題です。あなたの場合、マーチングキューブを介してこのデータを構築しているので、隣接するキューブから三角形を生成または取得することはそれほど難しくありません。ただし、生成ステップを通過し、三角形のバッグがある場合は、適切なメッシュトポロジデータ構造が必要になります。ウィングエッジまたはクアッドエッジはどちらも適切な選択です。

于 2013-03-26T03:20:01.983 に答える
7

a、b、cとは何ですか?

それらが三角形の頂点である場合、特定の頂点ではなく、三角形の法線を計算しています。その場合の仮定は、三角形全体が平らであるということです。これはフラットシェーディングと呼ばれます。

一方、三角形の内部全体でサーフェス法線を補間する場合(グーローシェーディングで使用)、最初に3つの頂点に3つの異なる法線を設定する必要があります。これは少し簡単ではありませんが、それでも簡単です。1つの方法は、頂点で法線を取得するために、頂点を共有するすべての三角形の法線を平均化することです。これには明らかに接続情報が必要です(または何らかの方法でそれを抽出する必要があります)。

3つの異なる法線(たとえば、na、nb、nc)があると、任意の内部点の法線を重心座標を介して計算できます。頂点をva、vb、vcとし、内部点の重心座標をαとβとします。次に、内部点vとその法線nは次の式で与えられます。

v = α*va + β*vb + (1 - α - β)*vc
n = α*na + β*nb + (1 - α - β)*nc

この補間された法線(n)は、グーローシェーディングに使用する必要があります。

于 2013-03-25T21:32:16.317 に答える