vtk模型更新的两种方法

需求:读取模型文件后,需要对模型重新读取并更换,由于vtk内存的管理问题,直接操作vtkRenderer 或者vtkAssembly 时,旧的模型存在需要释放的问题。
方法1:

	//将读取的模型指针放到全局,
	vtkSmartPointer<vtkSTLReader> modreader =NULL;
	//通过指针重新去读取文件并更新显示
	mod = "Resources/mod.stl";   //模型路径
	modreader->SetFileName(mod .c_str()); //读取模型
	modreader->Update();  //
	WindowRender->Render();

方法2:

	//在读取模型时,记录这个模型的一些参数,然后通过遍历reader 去找到这个模型后修改
	vtkActorCollection* actorCollection = renderer->GetActors();
	int num = actorCollection->GetNumberOfItems();
	std::cout << "GetActors Size=" << num << std::endl;  //
	//这个函数比较重要,否则getNextActor将没法得到正确的actor
	actorCollection->InitTraversal();
	for (int i = 0; i < num; ++i)
	{
		vtkActor* actor = actorCollection->GetNextActor();
		std::cout << "GetLength=" << actor->GetLength() << std::endl;  //
		if(actor->GetLength() > 200)   //找到自己想要的模型了
		{ 
			//取模型 根据点云生成的几何图元
			auto buttcoilMapper = actor->GetMapper();
			//重新去读取模型文件
			mod = "Resources/mod.stl";  
			vtkSmartPointer<vtkSTLReader> modreader= vtkSmartPointer<vtkSTLReader>::New(); 		
			modreader->SetFileName(mod .c_str()); 
			modreader->Update();  //
			//更新模型的几何图元
			buttcoilMapper->SetInputConnection(buttcoilreader->GetOutputPort());
			WindowRender->Render();
		}
	}

以上两种方法,都能保证旧的模型资源及时得到释放

你可能感兴趣的:(c++)