计算法向量

时间:2015-01-14 03:51:22

标签: c++ math 3d directx hlsl

当我只有TANGENT和BINORMAL向量时,是否可以计算我的网格法线向量?

      float4 Binormal : BINORMAL ;
      float4 Tangent  : TANGENT  ;
      float4 Position : POSITION ;

1 个答案:

答案 0 :(得分:4)

据我所知,通过交叉乘积从正常向量和切向向量定义了副法向量:

binormal = tangent x normal

因此normal = binormal x tangent,就是你所写的是正确的。

根据文档the cross product is defined for vectors of size 3,您可以执行以下操作:

normal = float4(cross(binormal.xyz, tangent.xyz), 1.0);

这是我使用HLSL的交叉产品,我推荐。但要详细了解,您实际上并未执行real cross product

真正的公式应该如下,其中u是binormal,v是tangentsnormal

formula of cross product

因此,交叉产品的代码应该是:

normal.x = binormal.y*tangent.z - binormal.z*tangent.y;
normal.y = binormal.z*tangent.x - binormal.x*tangent.z;
normal.z = binormal.x*tangent.y - binormal.y*tangent.x;

另一个混合版本(返回大小为3的向量,如果你想要一个4项向量,则使用float4(..., 1.0)):

normal = binormal.yzx*tangent.zxy - binormal.zxy*tangent.yzx;
相关问题