2017-03-20 5 views
0

地形を構成するメッシュがたくさんあります。 BIGメッシュは1つではありません。それはゲームのもので、私はプレイヤーが戦いを計画するためのツールを作っています。既存の法線を使用して接線を平滑化します。 OpenGL Lighting

すべてのメッシュが頂点と平均法線です。接線はありません。

私は十分に簡単に接線と双曲線を作成することができますが、それは悪く見えます。いつものように、それらを平滑化したり平均化したりする必要があります。スムージングを行うには小さなものから大きなメッシュを1つ作成する必要があります。何のためにも多くの仕事のようです。

私はスムージング/平均化された状態の法線を既に持っているので、接線を修正するためにそれらを使う方法はありますか?

私はThis Methodを使ってシェーダにTBNマトリックスを作成していました。それは動作しますが、ミックステクスチャ、テクセルによってブレンドされた数十万の4レイヤーを描画しているので、オーバーヘッドは高価です。

更新

OK ... 1は、限り私はこのために、通常の使用言うことができるようにすることはできません。.. 私は巨大なメッシュ上に作成するためにコードを書いて、その後にそれを後戻り昨日一日を過ごしますそのセクションメッシュに移動します。ニコShhertlerについて :

for(int i = 0; i < getVerts().length; i += 3) { 
    Vector3f v0 = getVerts()[i].getVectorXYZ(); 
    Vector3f v1 = getVerts()[i + 1].getVectorXYZ(); 
    Vector3f v2 = getVerts()[i + 2].getVectorXYZ(); 

    Vector2f uv0 = getVerts()[i].getVectorUV(); 
    Vector2f uv1 = getVerts()[i + 1].getVectorUV(); 
    Vector2f uv2 = getVerts()[i + 2].getVectorUV(); 

    Vector3f n = getVerts()[i].getVectorNXYZ(); 

    Vector3f deltaPos1 = new Vector3f(); 
    Vector3f.sub(v1, v0, deltaPos1); 
    Vector3f deltaPos2 = new Vector3f(); 
    Vector3f.sub(v2, v0, deltaPos2); 

    float deltaUv1 = uv1.getY() - uv0.getY(); 
    float deltaUv2 = uv2.getY() - uv0.getY(); 

    // Tangent 
    float tx = (deltaPos1.getX() * deltaUv2) - (deltaPos2.getX() * deltaUv1); 
    float ty = (deltaPos1.getY() * deltaUv2) - (deltaPos2.getY() * deltaUv1); 
    float tz = (deltaPos1.getZ() * deltaUv2) - (deltaPos2.getZ() * deltaUv1); 
    Vector3f t = new Vector3f(tx, ty, tz); 

    // Bitangent 
    Vector3f b = new Vector3f(); 
    Vector3f.cross(n, t, b); 

    // Final tangent 
    Vector3f smoothTangent = new Vector3f(); 
    Vector3f.cross(b, n, smoothTangent); 
    smoothTangent.normalise(); 

        // These are where I store all the vertex data, so it's one tangent per vertex. 
    getVerts()[i].setTXYZ(smoothTangent); 
    getVerts()[i + 1].setTXYZ(smoothTangent); 
    getVerts()[i + 2].setTXYZ(smoothTangent); 
    } 
+0

そして、あなたは接線を計算するのに使いやすい*簡単な方法を表示できますか? –

+0

これはコメントですが、ほとんどのメソッドと同じように動作します。これがあなたに役立つかどうか参照してください。http://www.java-gaming.org/index.php?topic=33259.0 基本的に私がやっていること。 –

+0

質問を編集して詳細情報を追加することができます(これはコードで行う必要があります)。すべてのインシデント面で平均化するのではなく、頂点のために既に存在する可能性のある接線を上書きしているかのようです。さらに、隣接するパッチの対応する頂点を追跡し、それを通常どおりに平均化することもできます。 –

答えて

0

結局のところ接線と平均/平滑化された法線とbitangentを整列させるために、通常のを使用する方法があります。

これらの2行は、接線とBiTangentを法線に対して90度に強制します。 「グラム・シュミット・プロセス」

t = normalize(t-dot(n,t)*n); 
b = normalize(b-dot(n,b)*n); 
関連する問題