其实前面还应该介绍渲染窗口、渲染场景、演员、交互、属性、相机、灯光、颜色、纹理、坐标。
出图的效果图
无奈上次写完注释的代码没保存,而且也不难,注意语法错误
#include <vtkSmartPointer.h>
#include <vtkStructuredPointsReader.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkMarchingCubes.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
//测试文件:data/head.vtk
//这段代码是作为vtk可视化管线的入门。可视化管线的三要素是数据对象source、处理对象filter、数据流方向mapper区别:基于数据流的初始化、维持、终止。
//根据数据的生成方式,source可分为程序源对象(procedural如vtkCylinder依据程序代码生成,第一个柱体用过)和读取源对象(reader如vtkDICOMImageReader心脏用过)
//还有就是source 无输入>=1输出 filter>=1输入 >=1输出 mapper>=1输入 无输出
int main(int argc, char* argv[])
{
if (argc < 2)
{
//std::cout<<argv[0]<<" "<<"VTK-File(*.vtk)"<<std::endl;
//return EXIT_FAILURE;
}
//读入Structured_Points类型的vtk文件。我这个程序直接把文件名带进去了 不用额外的读入
vtkSmartPointer<vtkStructuredPointsReader> reader =
vtkSmartPointer<vtkStructuredPointsReader>::New();
reader->SetFileName("../head.vtk");//一个弱智的问题是:程序编译时遇到相对路径去哪里找文件?答曰:项目文件同一个路径下
//用移动立方体法提取等值面。这货是作为filter的,but filter是啥,翻译过来是过滤器
vtkSmartPointer<vtkMarchingCubes> marchingCubes =
vtkSmartPointer<vtkMarchingCubes>::New();
marchingCubes->SetInputConnection(reader->GetOutputPort());//这货只接受一个输入;GetOutputPort和SetInputConnection两边必须类型匹配!
marchingCubes->SetValue(0, 500);
//将生成的等值面数据进行Mapper mapper是啥意思来着?用来渲染几何数据
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(marchingCubes->GetOutputPort());//vtk可视化管线的输入数据接口
//把Mapper的输出送入渲染引擎进行显示
//////////////////////////////////////渲染引擎部分////////////////////////////////////
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
//鼠标 键盘 时钟的交互机制
vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renWin->AddRenderer(renderer);
interactor->SetRenderWindow(renWin);
renderer->AddActor(actor);
renderer->SetBackground(1.0, 1.0, 1.0);
renWin->SetSize(640, 480);
renWin->Render();
renWin->SetWindowName("vtkPipelineDemo");
interactor->Initialize();
interactor->Start();
//////////////////////////////////////////////////////////////////////////////////////////////////
return 0;
}