(04)VTK移动模型,判断是否相交

2023-11-08

前言

在模型相交检测时(碰撞检测),使用了重写vtkInteractorStyleTrackballActor函数的自己构建的交互器,实现检测鼠标按键,并显示不同颜色在不同相交情况时。

方法

重写 vtkInteractorStyleTrackballActor

// Define interaction style
class MouseInteractorStyle6 : public vtkInteractorStyleTrackballActor
{
public:
	static MouseInteractorStyle6* New();
	vtkTypeMacro(MouseInteractorStyle6, vtkInteractorStyleTrackballActor);

	virtual void OnLeftButtonDown()
	{
		std::cout << "Pressed left mouse button." << std::endl;
		// Forward events
		vtkInteractorStyleTrackballActor::OnLeftButtonDown();
	}

	virtual void OnMiddleButtonUp()
	{

		int x = this->Interactor->GetEventPosition()[0];
		int y = this->Interactor->GetEventPosition()[1];
		this->FindPokedRenderer(x, y);
		this->FindPickedActor(x, y);

		if (this->CurrentRenderer == NULL || this->InteractionProp == NULL)
		{
			std::cout << "Nothing selected." << std::endl;
			return;
		}

		vtkSmartPointer<vtkPropCollection> actors =	vtkSmartPointer<vtkPropCollection>::New();

		this->InteractionProp->GetActors(actors);
		actors->InitTraversal();
		vtkActor* actor = vtkActor::SafeDownCast(actors->GetNextProp());

		vtkPolyData* polydata = vtkPolyData::SafeDownCast(actor->GetMapper()->GetInputAsDataSet());

		vtkSmartPointer<vtkTransform> transform =	vtkSmartPointer<vtkTransform>::New();
		transform->SetMatrix(actor->GetMatrix());

		vtkSmartPointer<vtkTransformPolyDataFilter> transformPolyData =	vtkSmartPointer<vtkTransformPolyDataFilter>::New();

		transformPolyData->SetInputData(polydata);
		transformPolyData->SetTransform(transform);
		transformPolyData->Update();

		vtkSmartPointer<vtkSelectEnclosedPoints> selectEnclosedPoints =	vtkSmartPointer<vtkSelectEnclosedPoints>::New();
		selectEnclosedPoints->SetInputConnection(transformPolyData->GetOutputPort());
		selectEnclosedPoints->SetSurfaceData(this->Sphere);
		selectEnclosedPoints->Update();

		vtkDataArray* insideArray = vtkDataArray::SafeDownCast(selectEnclosedPoints->GetOutput()->GetPointData()->GetArray("SelectedPoints"));

		bool inside = false;
		for (vtkIdType i = 0; i < insideArray->GetNumberOfTuples(); i++)
		{
			if (insideArray->GetComponent(i, 0) == 1)
			{
				inside = true;
				break;
			}
		}

		if (inside)
		{
			this->CubeActor->GetProperty()->SetColor(1, 0, 0);
		}
		else
		{
			this->CubeActor->GetProperty()->SetColor(0, 1, 0);

		}

		this->StopState();

	}

	vtkPolyData* Sphere;
	vtkActor* CubeActor;
};
vtkStandardNewMacro(MouseInteractorStyle6); 

加载两个模型(一个是球,另一个是通过构造多边形并进行拉伸形成立方体的一个立方体模型)

	{
		// Sphere
		vtkSmartPointer<vtkSphereSource> sphereSource =	vtkSmartPointer<vtkSphereSource>::New();
		sphereSource->SetRadius(2000);
		sphereSource->Update();

		vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
		sphereMapper->SetInputConnection(sphereSource->GetOutputPort());

		vtkSmartPointer<vtkActor> sphereActor =	vtkSmartPointer<vtkActor>::New();
		sphereActor->SetMapper(sphereMapper); 

		// Visualize
		vtkSmartPointer<vtkRenderer> renderer =	vtkSmartPointer<vtkRenderer>::New();
		vtkSmartPointer<vtkRenderWindow> renderWindow =	vtkSmartPointer<vtkRenderWindow>::New();
		renderWindow->AddRenderer(renderer);

		vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =	vtkSmartPointer<vtkRenderWindowInteractor>::New();
		renderWindowInteractor->SetRenderWindow(renderWindow);

		renderer->AddActor(sphereActor);
		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> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
		polygonMapper->SetInputConnection(m_extrude_chuang->GetOutputPort());
		vtkSmartPointer<vtkActor> coneActor2 = vtkSmartPointer<vtkActor>::New();
		coneActor2->SetMapper(polygonMapper);

		renderer->AddActor(coneActor2);

		renderWindow->Render();

		vtkSmartPointer<MouseInteractorStyle6> style =
			vtkSmartPointer<MouseInteractorStyle6>::New();
		style->Sphere = sphereSource->GetOutput();
		style->CubeActor = coneActor2;
 
		coneActor2->GetProperty()->SetColor(0, 1, 0);
		renderWindowInteractor->SetInteractorStyle(style);
		renderWindowInteractor->Start();
 }

结果

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(04)VTK移动模型,判断是否相交 的相关文章

随机推荐

  • 单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

    想要更多项目私wo 一 电路设计 室内环境智能监测系统 主要功能 1 检测空气温湿度 2 检测光照强度 3 检测烟雾浓度 4 数据显示在手机端和设备OLED屏幕上 5 当空气温度高于设定的阈值时 风扇开启 6 当空气湿度低于设定的阈值时 加
  • Hive基本架构和原理

    概述 Hive是建立在 Hadoop 上的数据仓库基础构架 它提供了一系列的工具 可以用来进行数据提取转化加载 ETL 这是一种可以存储 查询和分析存储在 Hadoop 中的大规模数据的机制 Hive 定义了简单的类 SQL 查询语言 称为
  • implicit declaration of function 问题解决

    C语言程序编译后出现警告 warning implicit declaration of function client tcpinit Wimplicit function declaration 原因 相关的头文件没有声明这个函数 在相
  • 如何使用Java以编程方式在Excel中创建数据透视表?

    Excel电子表格中的数据透视表用于以交互方式汇总数据 假设在工作表中有许多发票的数据 在这种情况下 可以使用数据透视表汇总按客户或产品分组的发票 在本文中 将学习如何以编程方式处理Excel中的数据透视表 特别是 将了解如何在Java中创
  • JavaScript—ES6 元编程(5)

    几年前 ES6 刚出来的时候接触过 元编程 Metaprogramming 的概念 不过当时还没有深究 在应用和学习中不断接触到这概念 比如 mobx 5 中就用到了 Proxy 重写了 Observable 对象 觉得有必要梳理总结一下
  • openGL之API学习(一一一)glUniform

    设置当前着色器程序中的一致变量的值 具体包含一系列函数 void glUniform1f GLint location GLfloat v0 void glUniform2f GLint location GLfloat v0 GLfloa
  • 持安零信任加入PKS体系生态联盟,共创办公安全新生态

    近日 PKS体系生态联盟公布最新一期会员单位名单 零信任办公安全领域的明星企业持安科技成为其网络安全领域新增会员 未来将与众多合作伙伴一同建设网络安全强国 PKS体系生态联盟是在中国电子信息产业集团有限公司的倡议下 广泛联合中央企业 国家研
  • html5--自定义属性

    一 添加属性 第一种不能html结构上看到 1 直接添加 通过querySelector获取到html元素之后 直接 属性进行初始化就可以为元素添加自定义属性了 div 123 div 2 setAttribute 属性名 属性值 添加自定
  • UML概述及UML类图详解

    引言 UML图有很多种 但是并非必须掌握所有的UML图 才能完整系统分析和设计工作 一般说来 在UML图中 只要掌握类图 用例图 时序图的使用 就能完成大部分的工作 也就是说 掌握UML的20 就能做80 的事情 对于程序员来说 最频繁使用
  • Unity_如何改变Image图片

    被改变的物体 public GameObject Tab3 需要改变的图片 public Sprite Tab3Img 加载将要用于修改的图片的路径 public string TabImgPath2 Image 2 void Start
  • vue 实现无缝向左滚动 鼠标悬停、离开时停止、开始滚动

    效果 可以根据此代码改为轮播 html代码
  • od机考真题-TLV解码

    while 1 try Tag input dct nums input split
  • 静态链接和动态链接

    静态链接 由于在我们实际的开发中 不可能将他们都放在一个文件中执行 所以将他们生成 o文件进行 从而要将他们进行链接 从而实现一个可以执行的程序 这个过程就是静态链接 静态库 是由多个多个 o文件压缩打包形成的一个文件 静态链接的优点 他在
  • linux的判断命令test之数值判断

    判断命令test一般用于脚本当中 可以简写为中括号 其会对跟随的条件进行判断 一般可以分为数值判断 字符串判断和文件判断 语法格式为test 判断条件 或 判断条件 注意中括号 与判断条件之间必须存在空格 还需注意判断条件的判断符号与比较值
  • 【Ubuntu】手把手教你打造 【VS Code + Cmake + C/C++】 开发环境

    下载安装VSCODE CMAKE Cmake安装请看我的这篇帖子 https blog csdn net TU Dresden article details 122373789 spm 1001 2014 3001 5501 VScode
  • shell基础知识

    shell基础知识 脚本语言 脚本是短小的 用来让计算机完成一系列工作的程序 这类程序可以用文本编辑器修改 不需要编译 通常是解释运行的 是一个约定的标记 告诉系统其后路径所指定的程序即是解释此脚本文件的shell程序 shell变量 使用
  • maven集成单元测试插件

    1 maven不可允许忽略单元测试 2 引用jacoco version
  • 【Unity】 DoTween对UI进行DoFade操作存在问题及解决办法

    Unity DoTween对UI进行DoFade操作存在问题 Unity版本 5 2 5 4 当使用this GetComponent
  • 很好用的etcd可视化管理工具 etcdv3-browser

    etcd是一个高可用 强一致性的服务发现存储仓库的 是k8s里的一个基础组件 现在随着k8s的不断的被企业所使用 etcd也越来越被看好作为服务发现的好的组件之一 今天推荐的是一款用来对etcd进行管理的图形化管理工具 etcdv3 bro
  • (04)VTK移动模型,判断是否相交

    前言 在模型相交检测时 碰撞检测 使用了重写vtkInteractorStyleTrackballActor函数的自己构建的交互器 实现检测鼠标按键 并显示不同颜色在不同相交情况时 方法 重写 vtkInteractorStyleTrack