在CG中,基于Per-Pixel的算法经常会涉及到Tangent Space的坐标变换,比如Bump Mapping,需要将Object Space的Light Vector转换到Tangent Space,然后在和该Pixel上的Normal Vector进行计算,因为Normal Vector是在Tangent Space中的。
像上面的Bump Mapping,对于Normal Texture,如果Normal Vector(这里的Normal Vector不是指Vertex上的)是设计在Mesh的Object Space中的话,一方面,Mesh的复杂度导致Normal Vector不方便设计;另外,如果Mesh的形状发生改变,那么原来的Normal Vector将不能够适用。所以,将Normal Vector的设计就放在统一的一个空间里面(Tangent Space)中,然后通过一个Triangle Surface上的几何信息,进行几何变化,最后在同一个坐标空间来使用。
对于一个Normal Texture的图示,他里面所有像素上的Normal Vector都在u,v,n坐标系上的,这也就是Tangent Space:
当将一个Normal Texture贴到Mesh上后,单考虑一个Vertex,他对应于Normal Texture上的一个点(具体在哪由这个Vertex的Texture Address u-v指定),而他的法向量就对应了Tangent Space中的n,经过该Vertex,垂直于n可以构造出Tangent Space中的u-v平面,这实际上也就在Object Space中构造出了Tangent Space。如图所示,V1为该顶点,淡蓝色矩形框平面为对应的u-v平面:
在Object Space和Tangent Space两个坐标系下进行坐标变换必须找到这两个坐标系之间的过渡矩阵。
根据变换等式
*T =
: 为Object Space中的基向量,实际上就是一个单位矩阵
T : 过渡矩阵
: 为Tangent Space的基向量
可见T = 构成的矩阵,所以这里要求的就是这三个基向量
zt这里就是这个Vertex上的n。xt,yt分别对应于u,v两个基向量,这是后面要求的两个向量。
根据一个Triangle上面的贴图,可以构建这个模型:
记:
Vertex1 : V1(x1, y1, z1), T1(u1, v1), N1(nx1, ny1, nz1)
Vertex2 : V2(x2, y2, z2), T2(u2, v2), N2(nx2, ny2, nz2)
Vertex3 : V3(x3, y3, z3), T3(u3, v3), N3(nx3, ny3, nz3)
记:
T21 = T2-T1 = (u21, v21)
T31 = T3-T1 = (u31, v31)
则有
V21_ = V21-V21*N1*N1 V21*N1*N1是V21在u-v平面上的投影向量
V31_ = V31-V31*N1*N1
V21_和V31_分别为V21和V31在u-v平面上的投影向量
在图中的
v21 = Len(V21)*Nor(V21_)
v31 = Len(V31)*Nor(V31_)
Len()为计算对应向量的长度,Nor()为单位化对应向量,v21 和v31 分别为将V21和V31"拉到"u-v平面上去的向量。
根据在tangent space和Object Space两个空间是同构的,可以列出下面的等式:
u*u21 + v*v21 = v21
u*u31 + v*v31 = v31
解该方程,得到u,v,并单位化两个向量
通过上面的过程也就得到了--->过渡矩阵T。
得到过渡矩阵T后,就可以任意的转化两个坐标系中的坐标。
其他:
1:并不一定是标准正交基,所以T的转置矩阵并不一定等于T的逆矩阵。u,v的关系如何这要取决于上面的三个顶点的T1,T2,T3。
2:上面的计算过程是基于Vertex的,可以采用基于一个Triangle的计算方法,过程和上面是一致的,不同点在于这个时候u,v平面和Triangle平面重合。
3:在DirectX中有D3DXComputeTangent API对计算这三个基向量的支持。但是在他的描述中使用的是Tangent Vector(也就是u),Binormal Vector(也就是v)和Normal Vector(也就是n),且B = N Cross T
阅读(5888) | 评论(0) | 转发(0) |