(转)Ogre中计算Tangent, 感觉很不错!

代码
Vector3 Math::calculateTangentSpaceVector(
 
const Vector3& position1, const Vector3& position2, const Vector3& position3,
 Real u1, Real v1, Real u2, Real v2, Real u3, Real v3)
 {
   
//side0 is the vector along one side of the triangle of vertices passed in, 
   
//and side1 is the vector along another side. Taking the cross product of these returns the normal.
   Vector3 side0 = position1 - position2;
   Vector3 side1 
= position3 - position1;
   
//Calculate face normal
   Vector3 normal = side1.crossProduct(side0);
   normal.normalise();
   
//Now we use a formula to calculate the tangent. 
   Real deltaV0 = v1 - v2;
   Real deltaV1 
= v3 - v1;
   Vector3 tangent 
= deltaV1 * side0 - deltaV0 * side1;
   tangent.normalise();
   
//Calculate binormal
   Real deltaU0 = u1 - u2;
   Real deltaU1 
= u3 - u1;
   Vector3 binormal 
= deltaU1 * side0 - deltaU0 * side1;
   binormal.normalise();
   
//Now, we take the cross product of the tangents to get a vector which 
   
//should point in the same direction as our normal calculated above. 
   
//If it points in the opposite direction (the dot product between the normals is less than zero), 
   
//then we need to reverse the s and t tangents. 
   
//This is because the triangle has been mirrored when going from tangent space to object space.
   
//reverse tangents if necessary
   Vector3 tangentCross = tangent.crossProduct(binormal);
   
if (tangentCross.dotProduct(normal) < 0.0f)
   {
     tangent 
= -tangent;
     binormal 
= -binormal;
   }

 
return tangent;

 }

 

posted @ 2010-10-09 11:15  oayx  阅读(539)  评论(0编辑  收藏  举报