VTK 画矩形(带阴影的矩形,半透明遮挡区域)

图像内选择一个ROI(感兴趣区域)区域、区域外用黑色半透明图层遮挡。
也就是实现散景效果。
2D 图形,不涉及3D
Qt5.12.7
vtk-9.2

效果展示:
在这里插入图片描述

首先是初始化过程

也包含了设计方案。

定义12个顶点,画出4个半透明矩形。



	//散景(背景模糊)
	vtkSmartPointer<vtkPoints>				m_pBokehPoints = nullptr;
	vtkSmartPointer<vtkActor>				m_pBokehActor[4]{ nullptr };
	vtkSmartPointer<vtkAssembly>			m_pBokehAssembly{ nullptr };

void InitBokeh()
{
	//
	//	  3·------------------------------·2  
	//	   |/(区域1)///|   
	//	   |///|   
	//	   |/11/10/|   
	//	  7·--------·----------·--------·6  
	//	   |/|			 |/|   
	//	   |(区域2)//|			 |//(区域3)|   
	// 	   |/|			 |/|   
	//	  4·--------·----------·--------·5  
	// 	   |/8///9/|   
	// 	   |///|   
	// 	   |/(区域0)///|   
	// 	  0·------------------------------·1  
	// 

	m_pBokehPoints = vtkSmartPointer<vtkPoints>::New();
	//最外层
	m_pBokehPoints->InsertPoint(0, 0, 0, 0);
	m_pBokehPoints->InsertPoint(1, 0, 0, 0);
	m_pBokehPoints->InsertPoint(2, 0, 0, 0);
	m_pBokehPoints->InsertPoint(3, 0, 0, 0);
	//中层
	m_pBokehPoints->InsertPoint(4, 0, 0, 0);
	m_pBokehPoints->InsertPoint(5, 0, 0, 0);
	m_pBokehPoints->InsertPoint(6, 0, 0, 0);
	m_pBokehPoints->InsertPoint(7, 0, 0, 0);
	//核心(透明区域)
	m_pBokehPoints->InsertPoint(8 , 0, 0, 0);
	m_pBokehPoints->InsertPoint(9 , 0, 0, 0);
	m_pBokehPoints->InsertPoint(10, 0, 0, 0);
	m_pBokehPoints->InsertPoint(11, 0, 0, 0);

	auto funcPolygonGenerator = [](vtkNew<vtkPolygon>& polygon, int a, int b, int c, int d) {
		;
		polygon->GetPointIds()->SetNumberOfIds(4);
		polygon->GetPointIds()->SetId(0, a);
		polygon->GetPointIds()->SetId(1, b);
		polygon->GetPointIds()->SetId(2, c);
		polygon->GetPointIds()->SetId(3, d);
	};

	vtkNew<vtkPolygon> polygon[4];
	funcPolygonGenerator(polygon[0],0,1,5,4);	//区域0
	funcPolygonGenerator(polygon[1],7,6,2,3);	//区域1
	funcPolygonGenerator(polygon[2],4,8,11,7);	//区域2
	funcPolygonGenerator(polygon[3],9,5,6,10);	//区域3

	m_pBokehAssembly = vtkSmartPointer<vtkAssembly>::New();
	for (int i = 0; i < 4; ++i)
	{
		// 创建多边形数据
		vtkSmartPointer<vtkCellArray> polygons = vtkSmartPointer<vtkCellArray>::New();
		polygons->InsertNextCell(polygon[i]);

		// 创建多边形数据对象
		vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
		polyData->SetPoints(m_pBokehPoints);
		polyData->SetPolys(polygons);

		vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
		mapper->SetInputData(polyData);
		//VTK_MAPPER_TOPPING(mapper);

		m_pBokehActor[i] = vtkSmartPointer<vtkActor>::New();
		m_pBokehActor[i]->SetMapper(mapper);
		m_pBokehActor[i]->GetProperty()->SetColor(GetColor3d_background()); // 设置为黑色
		m_pBokehActor[i]->GetProperty()->SetOpacity(0.8);        // 设置半透明度
		m_pBokehActor[i]->SetPickable(false);

		m_pBokehAssembly->AddPart(m_pBokehActor[i]);
	}


//默认让矩形框不可见
	m_pBokehAssembly->SetVisibility(false);
	
//把装配体加到场景中
	DefaultRenderer->AddActor(m_pBokehAssembly);
}

设置矩形最外层四个顶点(0,1,2,3 四个点)

这四个点会影响到(4,5,6,7)四个点的X轴坐标.

void  SetBokehExtent(const int extent[6])
{
	m_pBokehPoints->SetPoint(0, extent[0], extent[2], 0);
	m_pBokehPoints->SetPoint(1, extent[1], extent[2], 0);
	m_pBokehPoints->SetPoint(2, extent[1], extent[3], 0);
	m_pBokehPoints->SetPoint(3, extent[0], extent[3], 0);
	//中层			
	m_pBokehPoints->SetPoint(4, extent[0], m_pBokehPoints->GetPoint(4)[1], 0);
	m_pBokehPoints->SetPoint(5, extent[1], m_pBokehPoints->GetPoint(5)[1], 0);
	m_pBokehPoints->SetPoint(6, extent[1], m_pBokehPoints->GetPoint(6)[1], 0);
	m_pBokehPoints->SetPoint(7, extent[0], m_pBokehPoints->GetPoint(7)[1], 0);
}

移动内部透明区域位置

更细致的判断按需求增加。

void MoveBokeh(double diagonalP0[3], double diagonalP1[3])
{
	double minX = 0, maxX = 0, minY = 0, maxY = 0;

//给坐标排序;求出坐下、右上
	diagonalP0[0] > diagonalP1[0] ? (maxX = diagonalP0[0]) && (minX = diagonalP1[0]) : (minX = diagonalP0[0]) && (maxX = diagonalP1[0]);
	diagonalP0[1] > diagonalP1[1] ? (maxY = diagonalP0[1]) && (minY = diagonalP1[1]) : (minY = diagonalP0[1]) && (maxY = diagonalP1[1]);

	double p0[3]{ minX,minY,0 }, p1[3]{ maxX,minY,0 }, p2[3]{ maxX,maxY,0 }, p3[3]{ minX,maxY,0 };

	//中层
	m_pBokehPoints->SetPoint(4, m_pBokehPoints->GetPoint(4)[0], p0[1], 0);
	m_pBokehPoints->SetPoint(5, m_pBokehPoints->GetPoint(5)[0], p0[1], 0);
	m_pBokehPoints->SetPoint(6, m_pBokehPoints->GetPoint(6)[0], p3[1], 0);
	m_pBokehPoints->SetPoint(7, m_pBokehPoints->GetPoint(7)[0], p3[1], 0);
	//核心(透明区域)
	m_pBokehPoints->SetPoint(8, p0);
	m_pBokehPoints->SetPoint(9, p1);
	m_pBokehPoints->SetPoint(10, p2);
	m_pBokehPoints->SetPoint(11, p3);

//刷新点的位置;设置装配体为可见
	m_pBokehPoints->Modified();

//这一行按需求来
	m_pBokehAssembly->SetVisibility(true);
}

注:vtkAssembly 也继承自vtkProp3D 也相当于一个演员(Actor).
它是多个Actor的装配体,可以统一控制显隐、位置等信息。可以很方便的控制Actor

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值