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();
		}
	}

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VTK提供了计算两个三维模型的交集的方法,可以使用vtkBooleanOperationPolyDataFilter类来实现。下面是一个使用vtkBooleanOperationPolyDataFilter类的示例代码: ```c++ #include <vtkSmartPointer.h> #include <vtkBooleanOperationPolyDataFilter.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkSTLReader.h> int main() { // 读取两个三维模型 vtkSmartPointer<vtkSTLReader> reader1 = vtkSmartPointer<vtkSTLReader>::New(); reader1->SetFileName("model1.stl"); reader1->Update(); vtkSmartPointer<vtkSTLReader> reader2 = vtkSmartPointer<vtkSTLReader>::New(); reader2->SetFileName("model2.stl"); reader2->Update(); // 计算两个三维模型的交集 vtkSmartPointer<vtkBooleanOperationPolyDataFilter> booleanOperation = vtkSmartPointer<vtkBooleanOperationPolyDataFilter>::New(); booleanOperation->SetOperationToIntersection(); booleanOperation->SetInputData(0, reader1->GetOutput()); booleanOperation->SetInputData(1, reader2->GetOutput()); booleanOperation->Update(); // 将交集进行渲染 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(booleanOperation->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 创建渲染器和窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 创建交互器 vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); // 将演员添加到渲染器中 renderer->AddActor(actor); // 渲染并启动交互器 renderWindow->Render(); interactor->Start(); return 0; } ``` 以上代码中的“model1.stl”和“model2.stl”是两个三维模型的文件名,可以根据实际情况进行修改。运行以上代码,即可在窗口中显示两个三维模型的交集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值