VTK学习(一)

来源:互联网 发布:三草两木淘宝品牌介绍 编辑:程序博客网 时间:2024/04/29 13:16

VTK采用管道过滤器结构,有两点要注意:

1.过滤器不改变源数据

2.如要保存过滤器的输出数据,不能简单的指针赋值,要研究其存放数据的数据结构,将数据拷贝到新创建的内存空间中。

VTK的基本框架

一、图形模型:source+filter

数据流对象:vtkDataObject+vtkProcessObject

关键类关系继承图如下:



关于vtkDataObject和vtkDataSet


VTK一般把数据表示成场数据,数据集是带有拓扑和几何结构的数据对象。除了空间结构,数据集还附带有属性数据。属性数据包括:标量,矢量,张量,法向,纹理坐标,以及场数据。


手动创建多边形和均匀网格数据对象例程:水灵vtk学习视频的程序

(1)手动创建多边形数据对象并显示

#include <iostream>#include <vtkDataArray.h>#include <vtkPolyData.h>#include <vtkPoints.h>#include <vtkCellArray.h>#include <vtkFloatArray.h>#include <vtkDataSetAttributes.h>#include <vtkDataSet.h>#include <vtkPolyDataMapper.h>#include <vtkRenderer.h>#include <vtkRenderWindow.h>#include <vtkActor.h>#include <vtkPointData.h>#include <vtkInteractorStyleTrackballActor.h>#include <vtkRenderWindowInteractor.h>int main(){static float x[8][3]={{0,0,0}, {1,0,0}, {1,1,0}, {0,1,0},{0,0,1}, {1,0,1}, {1,1,1}, {0,1,1}};static vtkIdType pts[6][4]={{0,1,2,3}, {4,5,6,7}, {0,1,5,4},{1,2,6,5}, {2,3,7,6}, {3,0,4,7}};//typedef long vtkIdTypevtkPolyData* cube=vtkPolyData::New();vtkPoints* points=vtkPoints::New();vtkCellArray* polys=vtkCellArray::New();vtkFloatArray* scalars=vtkFloatArray::New();for (int i=0;i<8;i++)points->InsertPoint(i,x[i]);for (int i=0;i<6;i++)polys->InsertNextCell(4,pts[i]);for (int i=0;i<8;i++)scalars->InsertTuple1(i,i);cube->SetPoints(points);cube->SetPolys(polys);cube->GetPointData()->SetScalars(scalars);points->Delete();polys->Delete();scalars->Delete();vtkPolyDataMapper*mapper=vtkPolyDataMapper::New();mapper->SetInput(cube);mapper->SetScalarRange(0,7);vtkRenderWindow* ren=vtkRenderWindow::New();vtkRenderer*render=vtkRenderer::New();vtkRenderWindowInteractor*iren=vtkRenderWindowInteractor::New();vtkInteractorStyleTrackballActor* style=vtkInteractorStyleTrackballActor::New();vtkActor*actor=vtkActor::New();iren->SetInteractorStyle(style);ren->AddRenderer(render);iren->SetRenderWindow(ren);actor->SetMapper(mapper);render->AddActor(actor);ren->Render();iren->Start();ren->Delete();iren->Delete();render->Delete();actor->Delete();return 0;}

(2)手动创建vtkImageData(与多边形数据不同,只要指定起点,间距和范围即可,用像素值来表示图像)

#include <iostream>#include <vtkImageData.h>#include <vtkFloatArray.h>#include "vtkRenderer.h"#include "vtkRenderWindow.h"#include "vtkRenderWindowInteractor.h"#include "vtkImageData.h"#include "vtkFloatArray.h"#include "vtkContourFilter.h"#include "vtkPolyDataMapper.h"#include "vtkActor.h"#include "vtkPointData.h"int main(){int i, j, k, kOffset, jOffset, offset;float x, y, z, s, sp;vtkRenderer *renderer = vtkRenderer::New();vtkRenderWindow *renWin = vtkRenderWindow::New();renWin->AddRenderer(renderer);vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();iren->SetRenderWindow(renWin);vtkImageData *vol = vtkImageData::New();vol->SetDimensions(26,26,26);vol->SetOrigin(-0.5,-0.5,-0.5);sp = 1.0/25.0;vol->SetSpacing(sp, sp, sp);vtkFloatArray *scalars = vtkFloatArray::New();for (k=0; k<26; k++){z = -0.5 + k*sp;kOffset = k * 26 * 26;for (j=0; j<26; j++) {y = -0.5 + j*sp;jOffset = j * 26;for (i=0; i<26; i++) {x = -0.5 + i*sp;s = x*x + y*y + z*z - (0.4*0.4);offset = i + jOffset + kOffset;scalars->InsertTuple1(offset,s);}}}vol->GetPointData()->SetScalars(scalars);scalars->Delete();vtkContourFilter *contour = vtkContourFilter::New();contour->SetInput(vol);contour->SetValue(0,0.0);vtkPolyDataMapper *volMapper = vtkPolyDataMapper::New();volMapper->SetInput(contour->GetOutput());volMapper->ScalarVisibilityOff();vtkActor *volActor = vtkActor::New();volActor->SetMapper(volMapper);renderer->AddActor(volActor);renderer->SetBackground(1,1,1);renWin->SetSize(450,450);// interact with datarenWin->Render();iren->Start();// Clean uprenderer->Delete();renWin->Delete();iren->Delete();vol->Delete();scalars->Delete();contour->Delete();volMapper->Delete();volActor->Delete();return 0;}


二、可视化模型:

vtkActor

vtkRenderer

vtkRenderWindow

vtkLight

vtkCamera

vtkMapper

vtkProperty



0 0