Binormal and Tangent

呃,很久以前拷下来的代码……

//let P = v1 - v0
D3DXVECTOR3 P = v1.pos - v0.pos;
//let Q = v2 - v0
D3DXVECTOR3 Q = v2.pos - v0.pos;
float s1 = v1.s - v0.s;
float t1 = v1.t - v0.t;
float s2 = v2.s - v0.s;
float t2 = v2.t - v0.t; 

//we need to solve the equation
// P = s1*T + t1*B
// Q = s2*T + t2*B
// for T and B


//this is a linear system with six unknowns and six equatinos, for TxTyTz BxByBz
//[px,py,pz] = [s1,t1] * [Tx,Ty,Tz]
// qx,qy,qz     s2,t2     Bx,By,Bz

//multiplying both sides by the inverse of the s,t matrix gives
//[Tx,Ty,Tz] = 1/(s1t2-s2t1) *  [t2,-t1] * [px,py,pz]
// Bx,By,Bz                      -s2,s1     qx,qy,qz  

//solve this for the unormalized T and B to get from tangent to object space


float tmp = 0.0f;
if(fabsf(s1*t2 - s2*t1) <= 0.0001f)
{
    tmp 
= 1.0f;
}

else
{
    tmp 
= 1.0f/(s1*t2 - s2*t1 );
}


tangent.x 
= (t2*P.x - t1*Q.x);
tangent.y 
= (t2*P.y - t1*Q.y);
tangent.z  
= (t2*P.z - t1*Q.z);

tangent 
= tmp * tangent;

binormal.x 
= (s1*Q.x - s2*P.x);
binormal.y 
= (s1*Q.y - s2*P.y);
binormal.z 
= (s1*Q.z - s2*P.z);

binormal 
= tmp * binormal;
posted @ 2006-10-16 15:02  eygneph  阅读(465)  评论(0编辑  收藏  举报