user1907603
user1907603

Reputation: 45

Calculate Normal Vector

Is it possible to calculate my mesh normal vector when I have just TANGENT and BINORMAL vectors ?

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

Upvotes: 2

Views: 2133

Answers (1)

Cimbali
Cimbali

Reputation: 11395

As far as I understand it, a binormal vector is defined from the normal and tangent vectors through a cross product :

binormal = tangent x normal

Thus normal = binormal x tangent, that is, what you wrote is correct.

Since according to the doc, the cross product is defined for vectors of size 3, you can do the following :

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

This is using the cross product from HLSL, which I recommend. But to get into more detail, you are not actually performing a real cross product.

The real formula should be the following, where u is binormal, v is tangent and s is normal :

formula of cross product

Thus the code for a cross product should, instead, be :

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;

And an alternate, swizzled version (that returns a vector of size 3, use float4(..., 1.0) if you want a 4 item vector) :

normal = binormal.yzx*tangent.zxy - binormal.zxy*tangent.yzx;

Upvotes: 4

Related Questions