几何体表面切线计算方法

来源:互联网 发布:java 桌面程序框架 编辑:程序博客网 时间:2024/06/12 01:39

http://blog.csdn.net/sck5711/article/details/4036337

 

struct vec3
{
  float x, y, z;
};

struct texcoord
{
  float u,v;
};

//计算切线
void calc_tangent(const vec3& p0,
   const vec3& p1,
   const vec3& p2,
   const texcoord& c0,
   const texcoord& c1,
   const texcoord& c2,
   vec3& out_tangent)
{
  vec3 p10;
  p10.x = p1.x - p0.x;
  p10.y = p1.y - p0.y;
  p10.z = p1.z - p0.z;

  vec3 p20;
  p20.x = p2.x - p0.x;
  p20.y = p2.y - p0.y;
  p20.z = p2.z - p0.z;

  texcoord t10;
  t10.u = c1.u - c0.u;
  t10.v = c1.v - c0.v;

  texcoord t20;
  t20.u = c2.u - c0.u;
  t20.v = c2.v - c0.v;

  float div = t20.u * t10.v - t10.u * t20.v;
  vec3 ddiv;
  ddiv.x = t10.v * p20.x - t20.v * p10.x;
  ddiv.y = t10.v * p20.y - t20.v * p10.y;
  ddiv.z = t10.v * p20.z - t20.v * p10.z;

  out_tangent.x = ddiv.x / div;
  out_tangent.y = ddiv.y / div;
  out_tangent.z = ddiv.z / div;
}

原创粉丝点击