18.5 在切线空间和物体空间之间变换
现在,我们在网格的每个顶点上都有一个正交TBN基,而且还有相对于网格物体空间的TBN向量坐标。所以,我们现在可以得到一个相对于物体空间坐标系的TBN矩阵,通过该矩阵我们可以将坐标从切线空间变换到物体空间:
\[{{\bf{M}}_{object}} = \left[ {\begin{array}{*{20}{c}}{{T_x}}&{{T_y}}&{{T_z}}\\{{B_x}}&{{B_y}}&{{B_z}}\\{{N_x}}&{{N_y}}&{{N_z}}\end{array}} \right]\]
由于该矩阵是正交矩阵,它的逆矩阵和转置矩阵相同。所以,从物体空间到正切空间的坐标转换矩阵为:
\[{{\bf{M}}_{tangent}} = {\bf{M}}_{object}^{ - 1} = {\bf{M}}_{object}^T = \left[ {\begin{array}{*{20}{c}}{{T_x}}&{{B_x}}&{{N_x}}\\{{T_y}}&{{B_y}}&{{N_y}}\\{{T_z}}&{{B_z}}&{{N_z}}\end{array}} \right]\]
为了在着色器代码中进行光照计算,我们希望将法线向量从正切空间变换到世界空间。一种实现方式是,先将法线向量从正切空间变换到物体空间,然后再从物体空间变换到世界空间:
nworld = (ntangentMobject)Mworld
不过,矩阵乘法满足结合律,所以我们可以把它改写为:
nworld = ntangent(MobjectMworld)
注意
\[{{\bf{M}}_{object}}{{\bf{M}}_{world}} = \left[ {\begin{array}{*{20}{c}}{ \leftarrow {\bf{T}} \to }\\{ \leftarrow {\bf{B}} \to }\\{ \leftarrow {\bf{N}} \to }\end{array}} \right]{{\bf{M}}_{world}} = \left[ {\begin{array}{*{20}{c}}{ \leftarrow {\bf{T'}} \to }\\{ \leftarrow {\bf{B'}} \to }\\{ \leftarrow {\bf{N'}} \to }\end{array}} \right] = \left[ {\begin{array}{*{20}{c}}{{{T'}_x}}&{{{T'}_y}}&{{{T'}_z}}\\{{{B'}_x}}&{{{B'}_y}}&{{{B'}_z}}\\{{{N'}_x}}&{{{N'}_y}}&{{{N'}_z}}\end{array}} \right]\]
其中,Tʹ = T•Mworld、Bʹ = B•Mworld、Nʹ = N•Mworld。这样,法线向量可以直接从正切空间变换到世界空间。我们只需要描述在世界空间中的TBN基,就可以将法线向量从物体空间变换到世界空间。
注意:我们只对向量进行变换(不考虑点的变换)。所以,我们只需要一个3×3矩阵。前面讲过,仿射矩阵的第4行用于平移,但是我们在这里不需要平移向量。
文件下载(已下载 1082 次)发布时间:2014/8/23 下午7:51:50 阅读次数:3976