vtk中的算法举例-计算法线、法线方向

5 篇文章 0 订阅

研究使用vtk,必须要深入底层的实现方法,因为不管以后自己用来开发3D处理的框架还是用其他的cgal、pytorch3d、openmesh等框架,都需要将各种点线面的处理算法进行改造使用。

inline void vtkTriangle::ComputeNormalDirection(double v1[3], double v2[3],
                                       double v3[3], double n[3])//v1,v2,v3为三角面片的三个顶点坐标,n为三角面片的法线方向。
{
  double ax, ay, az, bx, by, bz;

  // order is important!!! maintain consistency with triangle vertex order
  ax = v3[0] - v2[0]; ay = v3[1] - v2[1]; az = v3[2] - v2[2];
  bx = v1[0] - v2[0]; by = v1[1] - v2[1]; bz = v1[2] - v2[2];

  n[0] = (ay * bz - az * by);
  n[1] = (az * bx - ax * bz);
  n[2] = (ax * by - ay * bx);
}

三个点确定一个平面,在vtk中采用右手坐标系,在使用中要注意点的顺序,反了很可能面的位置虽然不错,但是显示却很怪,因为方向反了,就跟一个足球,其中一块反向的话,我也不能理解会是什么形状。运用两个向量的叉乘计算法线方向。(之前的数学栏目讲过向量运算,可以参考)

计算法线就是法向量除以模长。

//----------------------------------------------------------------------------
inline void vtkTriangle::ComputeNormal(double v1[3], double v2[3],
                                       double v3[3], double n[3])
{
  double length;

  vtkTriangle::ComputeNormalDirection(v1, v2, v3, n);

  if ( (length = sqrt((n[0]*n[0] + n[1]*n[1] + n[2]*n[2]))) != 0.0 )
  {
    n[0] /= length;
    n[1] /= length;
    n[2] /= length;
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值