为什么需要切线空间?
切线空间是为了解决法线贴图的问题。
法线是垂直于面的单位向量,当在贴图中记录法线时,其坐标系有如下选择:
- 世界坐标系:当面改变朝向改变时,贴图中的法线就失效了
- 模型坐标系:需要根据面的朝向,生成不同的法线贴图。想象一个立方体的砖头,他们的6个面的法线情况是一样的,也需要根据面的不同朝向生成对应的法线贴图
为了能统一使用一张法线贴图,就引出了切线空间。
什么是切线空间?
切线空间是面的局部空间。坐标轴分别是Tangent,Bitangent(副切线),Normal。
其中Tangent与uv坐标的u一致;Bitangent与v一致;Normal垂直于面。
Normal垂直于面,这个是确定的,可是T,B为什么要与uv一致呢?其实这是约定俗成的,理论上可以选择面上任意互相垂直的向量,选择uv是为了方便计算。
注意:由于面本身是定义在模型空间下的,所以切线空间的坐标轴是模型空间下的向量。
怎么计算切线空间的坐标轴?
以下计算都是在模型空间
已知:
- 三角形顶点坐标(P1, P2, P3)
- 顶点UV
求:向量T,B
注意:坐标是[-1, 1],uv是[0, 1],TB是单位向量
\( \vec{E_{1}} = \vec{P_{0}P_{1}} = \vec{P_{1}} - \vec{P_{0}} \)
\( \vec{E_{2}} = \vec{P_{0}P_{2}} = \vec{P_{2}} - \vec{P_{0}} \)
为什么TBN可以作为空间变换矩阵使用?
mat3 TBN = mat3(T, B, N);
类比模型矩阵,模型矩阵定义模型坐标系向世界坐标系的转换(旋转、缩放)(只考虑3x3矩阵,非齐次坐标),当一个模型坐标与模型矩阵相乘时,该坐标就被转换到世界坐标系。
模型矩阵又是什么呢?它是世界坐标系下的xyz轴,为模型坐标服务,它可以将模型坐标系下的坐标转换到世界坐标系。
同样,TBN是模型坐标系下的xyz轴,为切线坐标服务,它可以将切线坐标系下的坐标转换到模型坐标系。
总结:TBN 切线坐标系 -> 模型坐标系
可以推断出有如下应用:
- 切线坐标系 -> 世界坐标系 (\(M_{model} \cdot M_{TBN} \cdot P \))
- 世界坐标系 -> 切线坐标系 (\( M_{TBN}^{-1} \cdot M_{model}^{-1} \cdot P \))
参考资料
Tutorial 26 - Normal Mapping (ogldev.org)
标签:法线,space,切线,模型,Tangent,vec,坐标系,坐标 From: https://www.cnblogs.com/realmenghao/p/16754866.html