2015-01-14 76 views
2

當我只有TANGENT和BINORMAL向量時,是否可以計算出我的法向量法向量?計算法向量

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

您將不得不提供更多信息。 – user3344003

+1

通常將Normal作爲float3進行編碼更有意義,然後將.w組件設置爲1.0或-1.0的符號作爲float4相切。然後,您可以在着色器中重建副法線。請參閱[Lengyel方法](http://www.terathon.com/code/tangent.html)和[DirectXMesh](http://go.microsoft.com/fwlink/?LinkID=324981)。 –

回答

4

據我瞭解,副法線矢量從正常和切向量通過交叉產品定義:

binormal = tangent x normal

因此normal = binormal x tangent,就是你寫的是正確的。

因爲根據DOC,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;