Tangent Space的基向量计算方法

原文地址


在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两个坐标系下进行坐标变换必须找到这两个坐标系之间的过渡矩阵。
根据变换等式
<xo, yo, zo>*T = <xt, yt, zt>
<x0, y0, z0>  : 为Object Space中的基向量,实际上就是一个单位矩阵
T             : 过渡矩阵
<xt, yt, zt>  : 为Tangent Space的基向量

可见T = <xt, yt, zt>构成的矩阵,所以这里要求的就是这三个基向量

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 = V2-V1
V31 = V3-V1

则有
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,并单位化两个向量

通过上面的过程也就得到了<u,v,n>--->过渡矩阵T。
得到过渡矩阵T后,就可以任意的转化两个坐标系中的坐标。

其他:
1:<u,v,n>并不一定是标准正交基,所以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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值