vtk視覺化管線

MissZhou要努力發表於2016-04-30

其實前面還應該介紹渲染視窗、渲染場景、演員、互動、屬性、相機、燈光、顏色、紋理、座標。

出圖的效果圖


無奈上次寫完註釋的程式碼沒儲存,而且也不難,注意語法錯誤

#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;
}


相關文章