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;
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;