在VTK的体系中,要正常将actor输出STL文件,需要相应的PolyData三角化。
vSPNew( triangle, vtkTriangleFilter);
triangle->SetInputData( polyData );
triangle->Update();
在一些专业软件,比如Meshmixer中查看STL文件,如果有任何的“不和谐”都会被标注出来。
下图中的物体是用两个长方体拼凑而成的。因为存在共面,所以meshmixer用红线标注出来了。
#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkActor2D.h>
#include <vtkPoints.h>
#include <vtkSTLWriter.h>
#include <vtkAppendPolyData.h>
#include <vtkAppendFilter.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkSmoothPolyDataFilter.h>
#include <vtkPolyDataNormals.h>
#include <vtkCleanPolyData.h>
#include "tool.h"
using namespace std;
PointStruct getNormal(const PointStruct p1, const PointStruct p2, const PointStruct p3)
{
PointStruct normal;
PointStruct vec1( p1 - p3 );
PointStruct vec2( p2 - p3 );
vtkMath::Cross(vec1.point, vec2.point, normal.point);
vtkMath::Normalize( normal.point );
return normal;
}
PointStruct getNormal(const double *p1, const double *p2, const double *p3)
{
PointStruct normal;
PointStruct ps1( (double *)p1 );
PointStruct ps2( (double *)p2 );
PointStruct ps3( (double *)p3 );
PointStruct vec1( ps1 - ps3 );
PointStruct vec2( ps2 - ps3 );
vtkMath::Cross(vec1.point, vec2.point, normal.point);
vtkMath::Normalize( normal.point );
return normal;
}
vtkSmartPointer<vtkCellArray> g_Poly =
vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkPoints> g_Points =
vtkSmartPointer<vtkPoints>::New();
void CreateVol1()
{
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();