-
在切线空间和物体空间之间变换-python实现pdf转换成word/txt纯文本文件下载
资源介绍
18.4 顶点正切空间
在上一节中,我们为三角形推导了一个正切空间。不过,当进行法线贴图映射时,我
们希望以三角形的形式描述该正切空间,因为正切空间在三角形平面上是一个常量。所
以,我们在每个顶点上指定切线向量,就像是使用顶点法线来模拟一个光滑表面时所做的
事情一样:
1.对于网格中的任意一个顶点 v,它的切线向量 T 等于共享该顶点的每个三角形的切
线向量的平均值。
2.对于网格中的任意一个顶点 v,它的副切(法)线向量 B 等于共享该顶点的每个三
角形的副切(法)线向量的平均值。
在计算平均值之后,我们通常需要对 TBN 基进行正交化处理,使这 3 个向量彼此垂直
并为单位向量。这一工作通常使用 Gram-Schmidt 算法来完成。读者可以在网上找到能为任
意三角形网格生成顶点切线空间的代码:http://www.terathon.com/code/tangent.php。
这里,我们不直接在内存中存储副切线向量 B。而是,在需要 B 时计算 B=N×T,其中
N 是常规的经过平均后的顶点法线。此时,我们的顶点结构体为:
namespace Vertex
{
struct NormalMap
{
XMFLOAT3 Pos;
XMFLOAT3 Normal;
XMFLOAT2 Tex;
XMFLOAT3 TangentU;
} ;
}
回忆一下由 GeometryGenerator 程序生成的网格计算了对应 u 轴的切线向量 T。对于
Grid 和 Box 来说,我们可以直接在每个顶点中指定切线向量 T 的物体空间坐标(参见图
18.5)。对于 Cylinder 和 Sphere 来说,我们可以通过定义向量值函数 P(u,v)和计算∂P/∂u 来
求出每个顶点上的切线向量,其中参数 u 还被用作为 u 纹理坐标。
18.5 在切线空间和物体空间之间变换
现在,我们在网格的每个顶点上都有一个正交 TBN 基,而且还有相对于网格物体空间
的 TBN 向量坐标。所以,我们现在可以得到一个相对于物体空间坐标系的 TBN 矩阵,通过
该矩阵我们可以将坐标从切线空间变换到物体空间:
344 / 351