2012-01-12 16 views
1

私は、メッシュ内のすべての頂点の接線(バンプマッピングに必要)を計算しようとしています。 v1、v2およびv3は三角形の頂点であり、t1、t2およびt3はそれぞれのテクスチャ座標です。私は三角形の3つの頂点の接線を出力するはずです。接線計算OpenGL

Vec3f va = Vec3f{vertexData[a * 3 + 0], vertexData[a * 3 + 1], vertexData[a * 3 + 2]}; 
Vec3f vb = Vec3f{vertexData[b * 3 + 0], vertexData[b * 3 + 1], vertexData[b * 3 + 2]}; 
Vec3f vc = Vec3f{vertexData[c * 3 + 0], vertexData[c * 3 + 1], vertexData[c * 3 + 2]}; 

Vec2f ta = (Vec2f){texcoordData[a * 2 + 0],texcoordData[a * 2 + 1]}; 
Vec2f tb = (Vec2f){texcoordData[b * 2 + 0],texcoordData[b * 2 + 1]}; 
Vec2f tc = (Vec2f){texcoordData[c * 2 + 0],texcoordData[c * 2 + 1]}; 

Vec3f v1 = subtractVec3f(vb, va);    
Vec3f v2 = subtractVec3f(vc, va); 

Vec2f t1 = subtractVec2f(tb, ta); 
Vec2f t2 = subtractVec2f(tc, ta); 

float coef = 1/(t1.u * t2.v - t1.v * t2.u); 

Vec3f tangent = Vec3fMake((t2.v * v1.x - t1.v * v2.x) * coef, 
          (t2.v * v1.y - t1.v * v2.y) * coef, 
          (t2.v * v1.z - t1.v * v2.z) * coef); 

私の問題はcoef変数は時々、乗算がオフであることを引き起こしてnan (not a number)値であるということです。私のメッシュは単純複合体ではありませんが、私はすべてのメッシュ上でバンプマッピングを可能にするために接線を計算する普遍的な公式が好きです。 NaNをbecomming

答えて

1

coefは縮退三角形やテクスチャ座標のように、入力データといくつかの数値問題があることを示しています。式(t1.u * t2.v - t1.v * t2.u)が(ほとんど)消えないようにしてください。つまり、その絶対値がある妥当なしきい値よりも大きいことを確認してください。

良い正当性チェックは、|vb-va|>0^|vc-va|>0,|tb-ta|>0^|tc-ta|>0,|normalized(vb-va) . normalized(vc-va)| < 1および|normalized(tb-ta) . normalized(tc-ta)| < 1です。