题记:法向量的变换矩阵为“顶点变换矩阵的逆矩阵的转置”
,具体原因见http://blog.csdn.net/aquathinker/article/details/6610731
切线空间在法线贴图中有着重要作用,通常需要把灯光转换到切线空间进行计算(考虑到现有的图形硬件,完全没有这个必要)。对由参数方程计算出的规则曲面(比如,球体,圆环)来说,很容易通过方程计算出切线空间,但对任意的三角形网格来说,则没有那么简单。
切线空间是一个三维空间。对3D空间中的一个顶点来说,切空间的三条坐标轴分别对应该点的法线N,切线T,和副法线(binormal)B,显然,对不同的顶点来说,切空间是不同的,切线空间的三条坐标轴是依赖于几何体顶点坐标及对应的纹理坐标的。那么,如下图所示,已知三角形三个顶点及其纹理坐标的时候,如何计算出N,T,B呢?(其中RGB三个彩色坐标轴表示世界坐标系,黑色坐标轴表示切线空间坐标系)
值得注意的是:
(1)顶点坐标v0, v1,v2存在于世界坐标系,纹理坐标c0, c1,c2存在于纹理坐标系下。
(2)向量v01 = v1 – v0与向量c01 = c1 – c0 = (U1-U0, V1-V0) = ( U01 ,V01)方向一致;向量v02 = v2 – v0与向量c02 = c2 – c0 = (U2-U0, V2-V0) = ( U02 ,V02)方向一致。
(3)T,B分别和纹理坐标轴U,V是平行的。
那么,v01 = U01*T + V01*B
V02 = U02*T + V02*B
最终的变换形式:
(V1 – V0)(v2 – v0) – (V2 – V0)(v1 – v0)
T = ————————————————
(U2 – U0).(V1 – V0) – (V2 – V0).(U1 – U0)
(U2 – U0).(v1 – v0) – (U1 – U0).(v2 – v0)
B = ————————————————-
(U2 – U0).(V1 – V0) – (V2 – V0).(U1 – U0)
而N轴可以由两轴叉乘得到:
N = cross(T, B)
写成TBN矩阵的形式:
|Tx Bx Nx|
|Ty By Ny|
|Tz Bz Nz|
另一种解释(有助于理解):
T = normalize(dx/du, dy/du, dz/du)
N = T × normalize(dx/dv, dy/dv, dz/dv)
B = N × T
通俗一点,T = normalize(dx/du, dy/du, dz/du)说明所有问题,这个T变量的x值就是世界坐标系下x值的变化对应纹理坐标系下u值变化的正切,类比于2D曲线dy/dx就是曲线的正切值,也是反应这条曲线变化坡度的值一样。
更通俗一点,这个Tangent Space,切线空间,就是反应这个世界坐标空间坐标相对应纹理坐标相的变换坡度。
参考网址:
[1] http://blog.csdn.net/pizi0475/article/details/6861232
[2] http://www.blacksmith-studios.dk/projects/downloads/tangent_matrix_derivation.php
[3] http://blog.csdn.net/soilwork/article/details/1468860
[4] http://www.cnitblog.com/wjk98550328/archive/2010/04/15/35112.html
[5] http://blog.csdn.net/netbaixc/article/details/8241030