如何计算三角形的副法线和切线?

时间:2014-09-06 03:54:50

标签: math 3d

[拟用于游戏中的延迟照明计算]

假设我有一个任意三角形,顶点ABC,法线DEF和纹理坐标LMN。

现在,我们有载体

G = B-A
H = C-A

O = M-L
P = N-L

下一步是计算切线空间:

G = O.s * T + O.t * U
H = P.s * T + P.t * U

这是我被困的地方......

G和H是3维向量,而O和P是2维。

从这一点开始,乘法到切线空间的工作原理如何? 一旦确定了切线空间,我如何获得正常和切线? T是正常的,U是正切的吗?

1 个答案:

答案 0 :(得分:1)

我不使用纹理坐标来进行 TBN 矩阵计算

您的名字令人困惑,所以让我将三角形 3D 点重写为p0,p1,p2。您需要 TBN 矩阵T,B,N(正切,正常,正常)

  1. <强>正常

    法线垂直于三角形表面,因此您可以通过三角形顶点的叉积得到它:

    N=(p1-p0)x(p2-p0)
    

    方向取决于您的需求,因此您也可以使用此方法     N =(P2-P0)×(P1-P0) 这是唯一直接的向量

  2. <强>切线,副法线

    都位于三角形表面上,应与网格的其余部分兼容。这很棘手,取决于网格几何。如果已生成几何体(如球体,...),则可以将初始方向向量设置为某个轴。从那里很容易只使用交叉产品。例如,围绕Z轴的旋转几何:     T =(0.0,0.0,1.0)×N     B = N×T 这里的方向也取决于您的需求,因此您可以使用反向交叉操作数顺序

  3. 如果您不计算 TBN 兼容整个几何体,那么您将获得照明工件

    有时整个网格使用扭曲的单个整个矩形纹理,例如在这个椭球头中:

    ellipsoid texture

    仅在这种情况下,纹理坐标表示切线和副法线空间坐标,然后才能使用它们来获取T,B。我不使用这种方法,所以我将使用你的方程式。

    t0,t1,t2为三角形的 2D 纹理坐标(相对于点p0,p1,p2):

    (p1-p0) = (t1-t0).s * T + (t1-t0).t * B
    (p2-p0) = (t2-t0).s * T + (t2-t0).t * B
    

    这是线性方程组(6个未知数6个方程),因此求解并计算T,B(正切,副正规)。看这里How to calculate Tangent and Binormal?。解决方案也在那里(使用相同的字母)