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ʹ = TMworldBʹ = BMworldNʹ = NMworld。这样,法线向量可以直接从正切空间变换到世界空间。我们只需要描述在世界空间中的TBN基,就可以将法线向量从物体空间变换到世界空间。

注意:我们只对向量进行变换(不考虑点的变换)。所以,我们只需要一个3×3矩阵。前面讲过,仿射矩阵的第4行用于平移,但是我们在这里不需要平移向量。

文件下载(已下载 1082 次)

发布时间:2014/8/23 下午7:51:50  阅读次数:3976

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号