Game Development Reference
In-Depth Information
This is a linear system with six unknowns (three for each T and B ) and six equa-
tions (the x , y , and z components of the two equations). We can write this in ma-
trix form as follows.
() () ()
(
QQQ
QQQ
t
TTT
s
 

1
x
1
y
1
z
1
1
x
y
z
=
(7.35)
 

)
(
)
(
)
s
t
BBB
 

2
x
2
y
2
z
2
2
x
y
z
Multiplying both sides by the inverse of the
s t matrix, we have
() () ()
(
TTT
t
t
QQQ
QQQ .
1

x
y
z
2
1
1
x
1
y
1
z
=
(7.36)

)
(
)
(
)
BBB
st
s t
s s

x
y
z
12
21
2
1
2
x
2
y
2
z
This gives us the (unnormalized) T and B tangent vectors for the triangle whose
vertices are P , P , and P . To find the tangent vectors for a single vertex, we av-
erage the tangents for all triangles sharing that vertex in a manner similar to the
way in which vertex normals are commonly calculated. In the case that neighbor-
ing triangles have discontinuous texture mapping, vertices along the border are
generally already duplicated since they have different mapping coordinates any-
way. We do not average tangents from such triangles because the result would
not accurately represent the orientation of the bump map for either triangle.
Once we have the normal vector N and the tangent vectors T and B for a ver-
tex, we can transform from tangent space into object space using the matrix
TBN
TBN
TBN
x
x
x
.
(7.37)
y
y
y
z
z
z
To transform in the opposite direction (from object space to tangent space—what
we want to do to the light direction), we can simply use the inverse of this matrix.
It is not necessarily true that the tangent vectors are perpendicular to each other
or to the normal vector, so the inverse of this matrix is not generally equal to its
transpose. It is safe to assume, however, that the three vectors will at least be
close to orthogonal, so using the Gram-Schmidt algorithm (see Algorithm 2.16)
to orthogonalize them should not cause any unacceptable distortions. Using this
process, new (still unnormalized) tangent vectors
T and
B are given by
(
)
TT NTN
B
′ =− ⋅
(
)
(
)
=− ⋅
BNBNTBT .
− ⋅
(7.38)