算法:
Tangent space在Bump Map中有着重要作用,通常需要把灯光转换到tangent space进行计算。对由参数方程计算出的规则曲面(比如,球体,圆环)来说,很容易通过方程计算出tangent space,但对任意的三角形网格来说,则没有那么简单。
Tangent space是一个三维空间。对3D空间中的一个顶点来说,切空间的三条座标轴分别对应该点的法线N,切线T,和副法线(binormal)B,显然,对不同的顶点来说,切空间是不同的。那么在已知三角形三个顶点及其纹理坐标的时候,如何计算出N,T,B呢?
目前已知的数据有三角形的三个顶点在世界坐标中的位置: P0, P1,P2, 以及相应的纹理坐标在纹理空间中的位置C0 (U0,V0),C1,C2,则有:
P10 = P1 – P0,
P20 = P2 - P1 ,
C10 = C1 – C0 = (U1-U0, V1-V0) = ( U10 ,V10)
C20 = C2 – C0.= (U2-U0, V2-V0) = ( U20 ,V20)
注意,P10在世界坐标中的方向和C10在纹理空间中的方向是一致的(这一点确实比较抽象,偶画图研究了好久才弄明白-_-),同样,P20和C20也是如此,发现这一点很重要,可以说是整个计算的基石。进一步来说,T,B分别和纹理坐标轴U,V是平行的。因此我们有:
P10 = U10T + V10B
P20 = U20T + V20B
把矢量展开得到:
两边乘以[C10 C20]的逆矩阵,最后得到
法线N = T x B
这样我们就得到了坐标从切空间转变到世界坐标下的变换矩阵M = [ T B N ],当然,更加常用的是M的逆矩阵。注意,这里计算得出的只是面法线,如果需要计算每个顶点的法线,则应该对共享该顶点的多个面的法线取均值,求出结果。
一直搞不明白这个tangent space到底是什么宝贝,既然是tangent肯定需要做dx/dv之类的求导动作,可是,查来查去,都是讲不明白,最后看到这个,才恍然大悟:
T = normalize(dx/du, dy/du, dz/du)
N = T × normalize(dx/dv, dy/dv, dz/dv)
B = N × T
(Tangent space is just such a local coordinate system. The orthonormal basis for the tangent space is the normalized unperturbed surface normal Nn, the tangent vector Tn defined by normalizing dP/du, and the binormal Bn defined as Nn×Tn. The orthonormal basis for a coordinate system is also sometimes
called the reference frame.)
其实这个tangent space 就是我们熟悉的tangent,无非在pixel lighting进行现实应用时,理解为2个坐标系的变换。
说直白一点,T = normalize(dx/du, dy/du, dz/du),这句话说明所有问题,这个t变量的x值就是模型坐标系下x值的变化对应u值变化的正切,就跟2纬曲线dy/dx就是曲线的正切值,也是反应这条曲线变化坡度的值一样。
再直白一点,这个tangent space,切空间,就是反应这个模型空间坐标相对应纹理坐标相的变换坡度
参考:http://www.blacksmith-studios.dk/projects/downloads/tangent_matrix_derivation.php
http://www.cnitblog.com/wjk98550328/archive/2010/04/15/35112.html
http://blog.csdn.net/soilwork/article/details/1468860