天天看點

VTK實時變化重新整理,動态點顯示

VTK實時變化重新整理,動态點顯示

最近使用C++代碼讀取機床的一些資料,想要實時顯示點的變化,于是嘗試用VTK作動态顯示,結果發現通用的顯示過程(point->actor->mapper->rander->randerwindow)直接改變point,再調用

并不能達到效果,在網上找了很久,沒有一個有用的,感歎為什麼這麼簡單的問題為什麼搜出來的全是些來回抄的且沒有用的東西。

自己寫了一個簡單的實作,方法比較笨,由于直接調用rander()沒有效果,幹脆每次都重新new一下整個鍊,反正能達到視覺效果,代碼如下

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkPolyDataMapper.h"
#include "vtkInteractorStyle.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"
#include "vtkCellArray.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkCamera.h"

#include <string>
#include <sstream>
#include <Windows.h>
using namespace std;


int main()
{

	double camera_pos[3] = { 0,0,1 };
	double camera_foc[3] = { 0,0,0 };
	double camera_ang = 120;

	double point_path[12][2] = { {0,0},{0.3,0.5},{0.6,0.8},{1.,1.},{1.4,0.8},{1.7,0.5},
	{2.,0.},{1.7,-0.5},{1.4,-0.8},{1,-1.},{0.7,-0.8},{0.3,-0.5} };

	vtkRenderWindow *renderWindow = vtkRenderWindow::New();

	for (int i = 0; i < 100; i++) {

		vtkIdType idtype;
		double x, y, z;

		vtkPoints *points = vtkPoints::New();
		vtkCellArray *cells = vtkCellArray::New();

		//可以自定義資料來源,例如從傳感器采集,從标準輸入讀入,檔案讀入等
		//string line;
		//string num;
		//cin >> line;
		//if (line.size() == 1)break;
		//stringstream ss(line);
		//getline(ss, num, ','); x = atof(num.c_str());
		//getline(ss, num, ','); y = atof(num.c_str());
		//getline(ss, num, ','); z = atof(num.c_str());

		x = point_path[i % 12][0] - 0.02*i;
		y = point_path[i%12][1];
		z = 0;
		idtype = points->InsertNextPoint(x, y, z);
		cells->InsertNextCell(1, &idtype);

		vtkPolyData *polyData = vtkPolyData::New();
		polyData->SetPoints(points);
		polyData->SetVerts(cells);
		vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
		mapper->SetInputData(polyData);
		vtkActor *actor = vtkActor::New();
		actor->SetMapper(mapper);
		actor->GetProperty()->SetColor(0.0, 1.0, 0.0);
		actor->GetProperty()->SetPointSize(3);
		vtkRenderer *renderer = vtkRenderer::New();
		renderer->AddActor(actor);
		renderer->GetActiveCamera()->SetPosition(camera_pos);
		renderer->GetActiveCamera()->SetFocalPoint(camera_foc);
		renderer->GetActiveCamera()->SetViewAngle(camera_ang);

		renderWindow->AddRenderer(renderer);
		renderWindow->Render();
		Sleep(50);


		cells->Delete();
		points->Delete();
		polyData->Delete();
		mapper->Delete();
		actor->Delete();
		renderer->Delete();
	}

	renderWindow->Delete();

	return 0;
}

           

執行效果是一個運動的點,方法粗略,希望有懂vtk的教一下有沒有好點的辦法,不勝感激。

繼續閱讀