1:什么事Tangent space?

   Tangent Space与World Space,View Space其实是同样的概念,均代表三维坐标系。在这个坐标系中,X轴对应纹理坐标的U方向,沿着该轴纹理坐标U线性增大。Y轴对应纹理坐标的V方向,沿着该轴纹理坐标V线性增大。Z轴则是UXV,垂直于纹理平面。

2,为什么需要tangent space?

   在normal map等技术中,存储在texture中的值是基于tangent space的法线。因此,当我们sample这些texture中的法线进行光照计算时,必须要统一到同一坐标系下才能正确,这时候就需要切线空间(就像是所有的local space都要统一到world space一样)。

  那么为什么normal map里面存的法线信息是基于tangent sapce而不是基于local space呢?基于local space理论上也是可以的,但是这样的normal map只能用于一个模型,不同把这个normal map用于其他模型。比如说建模了一个人,并且生成了该模型基于local space的normal map, 如果我们建模同一个人,但是放的位置和角度和之前的不以牙膏,那么之前的normal map就不能用了,因为local Space并不一样,但如果我们normal map里存的是tangent space的normal的话,就不存在这个问题,因为只要模型一样,模型上每个点的tangent space就是一样的,所谓以不变应万变。

3、怎样计算tangent space?

   假设三角形三个坐标点以及纹理坐标点为P1(U1, v1)、P2(U2, V2)、 P3(U3, V3), 假设切线空间的三个基为T、B、N(T为切线方向,也就是U方向,B为副法线方向,也就是V方向),T与B都在三角形所在的平面上。(T、B、N分别为Tangent、Binormal、Normal)

P1 * T = U1;P2 * T = U2; P3 * T = U3;

P1 * B = V1; P2 * T = V3; p3 * T = V3;

由此可以解出T和B向量,由于N = T X B,因此便得到了该三角形的切线空间。

 

相关参考链接:http://www.blacksmith-studios.dk/projects/downloads/tangent_matrix_derivation.php

                   http://www.terathon.com/code/tangent.html

posted on 2012-01-13 16:45  cg_ghost  阅读(1052)  评论(0编辑  收藏  举报