(05)vtk通过多边形构建矩形,并拉伸成立方体,两个立方体独立操作

前言

想在三维界面进行用户交互,实现对模型的独立操作,两个模型是自己建的模型。

方法

使用多边形构建矩形,并拉伸成立方体,两个立方体独立操作

int MyTrackballActor()
{ 
	vtkSmartPointer<vtkLinearExtrusionFilter> m_extrude_sheyuan = vtkSmartPointer<vtkLinearExtrusionFilter>::New();

	{
		const int num_points = 4;
		vtkSmartPointer<vtkUnstructuredGrid> polygonGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
		vtkSmartPointer<vtkPoints> polygonPoints = vtkSmartPointer<vtkPoints>::New();
		vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
		vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
		vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
		double top_left[num_points][3] = {
			{ 0, 2280 - 3200, 0 },
			{ 0, 2280, 0 },
			{ -2300, 2280, 0 },
			{ -2300, 2280 - 3200, 0 }
		};
		double Hight = 2170.0;
		// 几何数据 + 拓扑数据
		polygonPoints->SetNumberOfPoints(num_points);
		polygon->GetPointIds()->SetNumberOfIds(num_points);
		for (int i = 0; i < num_points; ++i){
			polygonPoints->SetPoint(i, top_left[i]);
			polygon->GetPointIds()->SetId(i, i);
		}

		polygonGrid->InsertNextCell(polygon->GetCellType(), polygon->GetPointIds());
		polygonGrid->SetPoints(polygonPoints);

		vtkNew<vtkDataSetSurfaceFilter> surface_filter;
		surface_filter->SetInputData(polygonGrid);
		surface_filter->Update();

		vtkNew<vtkTriangleFilter> filter;
		filter->SetInputData(surface_filter->GetOutput());
		filter->Update();

		// Apply linear extrusion(对平面进行拉伸成3D)
		m_extrude_sheyuan->SetInputConnection(filter->GetOutputPort());
		m_extrude_sheyuan->SetExtrusionTypeToNormalExtrusion();
		m_extrude_sheyuan->SetVector(0, 0, 1);// 沿文字方向挤压,沿着z向上
		m_extrude_sheyuan->SetScaleFactor(Hight);// 设置挤压比例 //blog.csdn.net/wanyongtai/article/details/106490653
		m_extrude_sheyuan->Update();
	}




	vtkSmartPointer<vtkLinearExtrusionFilter> m_extrude_chuang = vtkSmartPointer<vtkLinearExtrusionFilter>::New();
	{
		//{
		const int num_points = 4;
		vtkSmartPointer<vtkUnstructuredGrid> polygonGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
		vtkSmartPointer<vtkPoints> polygonPoints = vtkSmartPointer<vtkPoints>::New();
		vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
		vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
		vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
		double chuangkuan_danbian = 800;//图纸显示为935mm
		double top_left[num_points][3] = {
			{ 100, -1 * chuangkuan_danbian, 0 },
			{ 2360, -1 * chuangkuan_danbian, 0 },
			{ 2360, chuangkuan_danbian, 0 },
			{ 100, chuangkuan_danbian, 0 },
		};
		double ChangHight = 851;
		// 几何数据 + 拓扑数据
		polygonPoints->SetNumberOfPoints(num_points);
		polygon->GetPointIds()->SetNumberOfIds(num_points);
		for (int i = 0; i < num_points; ++i){
			polygonPoints->SetPoint(i, top_left[i]);
			polygon->GetPointIds()->SetId(i, i);
		}

		polygonGrid->InsertNextCell(polygon->GetCellType(), polygon->GetPointIds());
		polygonGrid->SetPoints(polygonPoints);

		vtkNew<vtkDataSetSurfaceFilter> surface_filter;
		surface_filter->SetInputData(polygonGrid);
		surface_filter->Update();

		vtkNew<vtkTriangleFilter> filter;
		filter->SetInputData(surface_filter->GetOutput());
		filter->Update();

		// Apply linear extrusion(对平面进行拉伸成3D)
		m_extrude_chuang->SetInputConnection(filter->GetOutputPort());
		m_extrude_chuang->SetExtrusionTypeToNormalExtrusion();
		m_extrude_chuang->SetVector(0, 0, 1);// 沿文字方向挤压,沿着z向上
		m_extrude_chuang->SetScaleFactor(ChangHight);// 设置挤压比例 //blog.csdn.net/wanyongtai/article/details/106490653
		m_extrude_chuang->Update();
	}

	

	vtkSmartPointer<vtkDataSetMapper> polygonMappersheyuan = vtkSmartPointer<vtkDataSetMapper>::New();
	polygonMappersheyuan->SetInputConnection(m_extrude_sheyuan->GetOutputPort());
	vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
	coneActor->SetMapper(polygonMappersheyuan);

	vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
	polygonMapper->SetInputConnection(m_extrude_chuang->GetOutputPort());
	vtkSmartPointer<vtkActor> coneActor2 = vtkSmartPointer<vtkActor>::New();
	coneActor2->SetMapper(polygonMapper);
	
 
	vtkSmartPointer<vtkPoints> pointsInside = vtkSmartPointer<vtkPoints>::New();
	vtkSmartPointer<vtkPolyData> polyDataInside = vtkSmartPointer<vtkPolyData>::New();
	double point[3];

	vtkSmartPointer<vtkDelaunay3D> delaunay3D = vtkSmartPointer<vtkDelaunay3D>::New();
	delaunay3D->SetInputConnection(m_extrude_chuang->GetOutputPort());
	delaunay3D->Update();

	for (vtkIdType i = 0; i < m_extrude_chuang->GetOutput()->GetNumberOfPoints(); i++)
	{
		m_extrude_chuang->GetOutput()->GetPoint(i, point);

		double pcoords[3];
		// The number of weights >= max number of nodes in each cell
		double weights[4];

		int subId;
		vtkIdType cellId = delaunay3D->GetOutput()->FindCell(point, NULL, 0, .1, subId, pcoords, weights);

		if (cellId >= 0)
		{
			std::cout << "In cell " << cellId << std::endl;
			std::cout << "inside" << std::endl;
			pointsInside->InsertNextPoint(point);
		}
		else
		{
			std::cout << "outside" << std::endl;
		}
	}

	polyDataInside->SetPoints(pointsInside);

	vtkSmartPointer<vtkVertexGlyphFilter> vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
#if VTK_MAJOR_VERSION <= 5
	vertexGlyphFilter->SetInputConnection(polyDataInside->GetProducerPort());
#else
	vertexGlyphFilter->SetInputData(polyDataInside);
#endif
	vertexGlyphFilter->Update();

	// Mapper and actor for points inside
	vtkSmartPointer<vtkPolyDataMapper> pointsInsideMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	pointsInsideMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());
	vtkSmartPointer<vtkActor> pointsInsideActor = vtkSmartPointer<vtkActor>::New();
	pointsInsideActor->SetMapper(pointsInsideMapper);
	pointsInsideActor->GetProperty()->SetPointSize(6);
	pointsInsideActor->GetProperty()->SetColor(1, 0, 1);
 
 
	vtkRenderer *ren1 = vtkRenderer::New();

	ren1->SetBackground(0.1, 0.2, 0.4);

	// Finally we create the render window which will show up on the screen.
	// We put our renderer into the render window using AddRenderer. We also
	// set the size to be 300 pixels by 300.
	//
	vtkRenderWindow *renWin = vtkRenderWindow::New();
	renWin->AddRenderer(ren1);
	renWin->SetSize(900, 800);

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(renWin);
  
	vtkSmartPointer<StyleTrackballActor> style = vtkSmartPointer <StyleTrackballActor>::New();
	style->SetDefaultRenderer(ren1);
	style->ActorA = coneActor;
	style->ActorB = coneActor2;
	//vtkOBBTree * clipTree = vtkOBBTree::New();
	//vtkOBBTree * targetTree = vtkOBBTree::New();

	//targetTree->SetDataSet(targetPoly);
	//targetTree->BuildLocator(); 
	//clipTree->SetDataSet(clipPoly);
	//clipTree->BuildLocator();

	使用包围盒求交 ,求交部分在OBBNodeIntersected中。NULL表示不做任何转换
	//clipTree->IntersectWithOBBTree(targetTree, NULL, OBBNodeIntersected, this);

	 

	iren->SetInteractorStyle(style);
	ren1->AddActor(coneActor);
	ren1->AddActor(coneActor2);
	//ren1->AddActor(Actor1);
	//ren1->AddActor(Actor2);
 
	iren->Initialize();
	iren->Start();
	
	return 0;
} //blog.csdn.net/q610098308/article/details/108093627

效果  

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用VTK(Visualization Toolkit)库绘制一个立方体,并实现鼠标拖拽功能的主要步骤如下: 1. 导入VTK库和相关头文件: ```C++ #include <vtkSmartPointer.h> #include <vtkCubeSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> ``` 2. 创建立方体数据源: ```C++ vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New(); ``` 3. 创建数据映射器: ```C++ vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cubeSource->GetOutputPort()); ``` 4. 创建绘制对象(立方体的Actor): ```C++ vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); ``` 5. 创建渲染器和窗口: ```C++ vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); ``` 6. 创建交互器,并添加窗口对象: ```C++ vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); ``` 7. 配置交互器,使其支持鼠标拖拽操作: ```C++ vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); interactor->SetInteractorStyle(style); ``` 8. 启动渲染和交互过程: ```C++ renderWindow->Render(); interactor->Start(); ``` 以上便是使用VTK库实现鼠标拖拽绘制立方体的基本步骤。通过调用相应的函数,可以修改立方体的属性,如大小、颜色等,以实现个性化的立方体绘制效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rexinx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值