首页 > 其他分享 >切线空间的理解(Tangent space)

切线空间的理解(Tangent space)

时间:2022-10-05 02:11:58浏览次数:75  
标签:法线 space 切线 模型 Tangent vec 坐标系 坐标

为什么需要切线空间?

切线空间是为了解决法线贴图的问题。

法线是垂直于面的单位向量,当在贴图中记录法线时,其坐标系有如下选择:

  1. 世界坐标系:当面改变朝向改变时,贴图中的法线就失效了
  2. 模型坐标系:需要根据面的朝向,生成不同的法线贴图。想象一个立方体的砖头,他们的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  \))

 

参考资料

LearnOpenGL - Normal Mapping

Tutorial 26 - Normal Mapping (ogldev.org)

 

标签:法线,space,切线,模型,Tangent,vec,坐标系,坐标
From: https://www.cnblogs.com/realmenghao/p/16754866.html

相关文章