研究使用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;
}
}