VTK基本语法
vtkDataSet
vtkdataset类型是Image、Point、RectlinearGrid等类型的父类。
vtkdataset的函数:
vtkCollection
vtkCell
#include "stdafx.h"
#include "vtkCellArray.h"
#include "vtkDoubleArray.h"
#include "vtkFloatArray.h"
#include "vtkIntArray.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i;
//创建一个浮点型数组存储"点"
vtkFloatArray *pcoords = vtkFloatArray::New();
//设置维度,点->3
pcoords->SetNumberOfComponents( 3 );
//设置数组个数
pcoords->SetNumberOfTuples( 4 );
//指定每一个数组,具体的点坐标
float pts[4][3] = { { 0.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 },
{ 1.0, 0.0, 0.0 }, { 1.0, 1.0, 0.0}} ;
for( i=0; i<4; i++ )
{
//设置数组中的点
pcoords->SetTuple( i, pts[i] );
}
vtkPoints *points = vtkPoints::New();
//获得四个点
points->SetData( pcoords );
//创建网格数组
vtkCellArray *strips = vtkCellArray::New();
//设置单元由几个点组成
/* strips->InsertNextCell( 4 );
strips->InsertCellPoint( 0 );
strips->InsertCellPoint( 1 );
strips->InsertCellPoint( 2 );
strips->InsertCellPoint( 3 );*/
strips->InsertNextCell( 3 );
strips->InsertCellPoint( 0 );
strips->InsertCellPoint( 1 );
strips->InsertCellPoint( 2 );
//strips->InsertCellPoint( 3 );
//创建整形数组
vtkIntArray *temperature = vtkIntArray::New();
temperature->SetName( "Temperature" );
temperature->InsertNextValue( 60 );
temperature->InsertNextValue( 70 );
temperature->InsertNextValue( 80 );
// temperature->InsertNextValue( 90 );
/* //创建双精度型数组
vtkDoubleArray *vorticity = vtkDoubleArray::New();
vorticity->SetName( "Vorticity" );
vorticity->InsertNextValue( 2.7 );
vorticity->InsertNextValue( 4.1 );
vorticity->InsertNextValue( 5.3 );
vorticity->InsertNextValue( 3.4 );*/
//创建数据集
vtkPolyData *polydata = vtkPolyData::New();
//指定点和网格
polydata->SetPoints( points );
polydata->SetStrips( strips );
//指定标量
polydata->GetPointData()->SetScalars( temperature );
//polydata->GetPointData()->AddArray( vorticity );
vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
mapper->SetInput( polydata );
mapper->SetScalarRange( 0, 40 );
// Create an actor.
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
// Create the rendering objects.
vtkRenderer* ren = vtkRenderer::New();
ren->AddActor(actor);
vtkRenderWindow* renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren);
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
iren->Initialize();
iren->Start();
return 0;
}
vtkSmartPointer<vtkActor> points_actor=
vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkCellArray> polyvertex=
vtkSmartPointer<vtkCellArray>::New();
int Num=points->GetNumberOfPoints();
polyvertex->SetNumberOfCells(Num);
for(vtkIdType i=0;i<Num;i++)
{
vtkIdType cell[1]={i};
polyvertex->InsertNextCell(1,cell);
}
vtkSmartPointer<vtkPolyData> polydata_surf=
vtkSmartPointer<vtkPolyData>::New();
polydata_surf->SetPoints(points);
polydata_surf->SetVerts(polyvertex);
vtkSmartPointer<vtkDataSetMapper> points_map =
vtkSmartPointer<vtkDataSetMapper>::New();
points_map->SetInputData(polydata_surf);
points_actor->SetMapper(points_map);
render->AddActor(points_actor);
vtkSmartPointer<vtkPolyData> polydata =
vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
vtkSmartPointer<vtkVertexGlyphFilter> vertexFilter =
vtkSmartPointer<vtkVertexGlyphFilter>::New();
vertexFilter->SetInputData(polydata);
vertexFilter->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(vertexFilter->GetOutput());
mapper->Update();
vtkSmartPointer<vtkActor>actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
render->AddActor(actor);
数据source生成
vtkAlgorithm类
vtkAlgorithm类下面有vtkPolyDataAlgorithm、vtkUnstructuredGridAlgorithm等,可以生成想要的数据source,也有vtkReaderAlgorithm,可以读取vtk的数据文件。
vtkPolyDataAlgorithm
vtkPolyDataAlgorithm的子类包括vtkConeSource、vtkClinderSource、vtkClippolyData、vtkCutter vtkExtractEdge:
vtkPolyDataAlgorithm有如下函数,子类都可以调用:
常见的几个source:
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight(3.0);
cone->SetRadius(1.0);
cone->SetResolution(10);
vtkSphereSource *sphere = vtkSphereSource::New();
sphere->SetThetaResolution(12);
sphere->SetPhiResolution(12);
vtkNew<vtkCubeSource> cube;
cube->SetXLength(40);
cube->SetYLength(30);
cube->SetZLength(20);
利用cutter生成相交线:
vtkNew<vtkNamedColors> colors;
vtkNew<vtkCubeSource> cube;
cube->SetXLength(40);
cube->SetYLength(30);
cube->SetZLength(20);
vtkNew<vtkPolyDataMapper> cubeMapper;
cubeMapper->SetInputConnection(cube->GetOutputPort());
// Create a plane to cut,here it cuts in the XZ direction (xz
// normal=(1,0,0);XY =(0,0,1),YZ =(0,1,0)
vtkNew<vtkPlane> plane;
plane->SetOrigin(10, 0, 0);
plane->SetNormal(1, 0, 0);
// Create cutter
vtkNew<vtkCutter> cutter;
cutter->SetCutFunction(plane);
cutter->SetInputConnection(cube->GetOutputPort());
cutter->Update()
Mapper
vtkSmartPointer<vtkConeSource> coneSource =vtkSmartPointer<vtkConeSource>::New();
coneSource->Update();
vtkSmartPointer<vtkPolyData> polyData =vtkSmartPointer<vtkPolyData>::New();
polyData = coneSource->GetOutput();//sourced的输出是data
vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polyData);
vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
Actor
pRenderer = vtkSmartPointer<vtkRenderer>::New();
// 圆柱数据
pCylinderSource = vtkSmartPointer<vtkCylinderSource>::New();
pCylinderSource->SetCenter(0, 0, 0);
pCylinderSource->SetResolution(25);
pCylinderSource->SetHeight(2);
pCylinderSource->SetRadius(2);
// 圆柱的Mapper
pPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
pPolyDataMapper->SetInputConnection(pCylinderSource->GetOutputPort());
// 圆柱的Property
pProperty = vtkSmartPointer<vtkProperty>::New();
pProperty->SetColor(1, 0, 0);
pProperty->SetOpacity(0.5);
pProperty->SetAmbient(0.3);
pProperty->SetDiffuse(0.4);
pProperty->SetSpecular(0.8);
pProperty->SetShading(false);
pProperty->SetLineWidth(2.0);
pProperty->SetPointSize(2.0);
// 圆柱体
pCylinderActor = vtkSmartPointer<vtkActor>::New();
pCylinderActor->SetMapper(pPolyDataMapper);
pCylinderActor->SetProperty(pProperty);
pCylinderActor->SetDragable(false);
pCylinderActor->SetPickable(false);
pCylinderActor->SetScale(1.0);
pCylinderActor->SetPosition(0, 0, 0);
pCylinderActor->SetOrientation(0, 0, 0);
pCylinderActor->SetOrigin(0, 0, 0);
pRenderer->AddActor(pCylinderActor);
// 设置场景
pRenderer->SetBackground(0, 1, 0);
pRenderer->SetTwoSidedLighting(true);
renderer
vtkSmartPointer render=vtkSmartPointer::New();
创建一个vtkrenderer指针。
* void AddActor (vtkProp p) 向渲染器添加不同类型的道具。
如何添加一个actor:renderers->AddActor(glyphActor);
这是一个看名字就很容易理解的函数,再其他类中也有类似命名的函数,看名字就知道意思。如renderWindow->AddRenderer(renderers);
RemoveActor (vtkProp *p) 就不用介绍了
virtual void vtkRenderer::ResetCamera ( )
根据可见的actor自动设置摄像机。
相机将重新定位以观察演员的中心点,并沿其初始视平面法线(即,从相机位置定义到焦点的矢量)移动,以便可以看到所有演员。
在vtkOpenVRRenderer中重新实现。
vtkCamera vtkRenderer::GetActiveCamera ( )
获取当前的相机。
如果尚未为渲染器分配摄像机,则会自动创建新摄像机。 这不会重置相机
renderers[index]->GetActiveCamera()->Azimuth(30);
renderers[index]->GetActiveCamera()->Elevation(-30);
renderers[index]->GetActiveCamera()->Dolly(1.1);
Azimuth()等是vtkCamera的函数,设置了相机的位置视角角点距离等等。
vtkRendererWindow
#include "vtkSmartPointer.h"
#include "vtkSphereSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
int main()
{
// 实例化一个球体的数据源对象
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
// 实例化一个Mapper
vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
// 实例化一个Actor
vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();
sphereSource->SetRadius(0.2); // 设置球体的Source图像源半径
sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); // 关联Source的输出与Mapper的输入口
sphereActor->SetMapper(sphereMapper); // 将Mapper绑定到Actor上
// 实例化一个Renderer对象
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
// 实例化一个窗口对象
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
// 实例化一个窗口的交互器对象
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderer->AddActor(sphereActor); // 一个Renderer包含多个Actor
renWin->AddRenderer(renderer); // 一个RenderWindow包含多个Renderer,可以为不同Renderer设置视口
iren->SetRenderWindow(renWin); // 关联窗口和交互器
renWin->Render(); // RenderWindow 开始渲染
iren->Initialize(); // vtkRenderWindowInteractor 初始化事件监听
iren->Start(); // vtkRenderWindowInteractor开启事件监听循环
return 0;
}
vtkRenderWindowInteractor