2019
11-29

# （转）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;

} 