C# VTK 移动旋转

对vtk 场景中一个或多个选中物体进行移动旋转。

交互移动旋转坐标系

首先我们创建旋转的交互坐标系,三个移动Actor,三个旋转Actor,还需要4个定位坐标的小球Actor。

 public class CoordinateActor 中添加Actor// 当前选中的Actorpublic vtkActor selActor;// 定位中心小球public vtkActor cenActor;// 旋转Actorpublic vtkActor rotX;public vtkActor rotY;public vtkActor rotZ;// 移动Actorpublic vtkActor moveX;public vtkActor moveY;public vtkActor moveZ;// 末端定位小球public vtkActor moveXEnd;public vtkActor moveYEnd;public vtkActor moveZEnd;

创建X轴移动Actor 

  public vtkActor LineActor(Point3d p1, Point3d p2, double[] color){vtkLineSource lineSource = new vtkLineSource();lineSource.SetPoint1(p1.X, p1.Y, p1.Z);lineSource.SetPoint2(p2.X, p2.Y, p2.Z);lineSource.Update();vtkPolyDataMapper mapper = new vtkPolyDataMapper();mapper.SetInputData(lineSource.GetOutput());mapper.Update();vtkActor actor = new vtkActor();actor.SetMapper(mapper);actor.GetProperty().SetColor(color[0], color[1], color[2]);actor.GetProperty().SetLineWidth(10);return actor;}

这里的p1,p2 是根据模型的中心点和大小决定的。

假设创建了一个Box 长宽高 200, 模型中心在(0,0,0)。

以X移动Actor为例,这样vtkLineSource p1 = (0,0,0)   p2(200,0,0) 。

同时创建 cenActor , moveXEnd 两个定位小球。

现在我们已经创建了一个X轴方向的移动交互Actor ------- moveX。

X轴移动交互

有了moveX 现在为其添加移动交互的事件,参与移动的鼠标事件有四种。

MouseMove(LeftDown==false):

 当鼠标只是在场景中自由移动,未点击时,移动到moveX时应该触发待选状态,既是改变moveX 颜色。在MouseMove中需要随时判断是否鼠标选中Actor 且是 moveX。是就改变颜色,不是就还原颜色(需要设置为默认颜色)。

MouseDown

改变 bool LeftDown = true 

MouseUp

改变 bool LeftDown = false

firstPos == null 

lastPos = null

MouseMove(LeftDown==true):

此时真正开始旋转

1.计算移动距离方向

需要 两个Point2d 记录firstPos 和 lastPos 两个鼠标平面点,用于鼠标的移动距离和方向。

Point2d moveNorm = lastPos - firstPos; 

还记得我们之前的定位小球吗,将cenActor 和 moveXEnd  中心点 转换为屏幕坐标。

得到 center2d ,moveXEnd2d  

Point2d xLineNorm = moveXEnd2d - center2d

计算 moveNorm 投影到 xLineNorm  的 长度,既是移动的长度和方向(我们只在X 的正负方向移动)。

 // 计算点积public static double DotProduct2D(Point2d vectorA, Point2d vectorB){return vectorA.X * vectorB.X + vectorA.Y * vectorB.Y;}// 计算向量的模(长度)public static double Magnitude2D(Point2d vector){return Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y);}// 计算向量 A 投影到向量 B 上的长度public static double ProjectionLength(Point2d vectorA, Point2d vectorB){double dotProduct = DotProduct2D(vectorA, vectorB);double magnitudeB = Magnitude2D(vectorB);if (magnitudeB == 0)return 0;return dotProduct / magnitudeB;}

2.实现移动

vtk 通过vtkTransform实现移动旋转

   public void MoveAllAcotr(double moveValue, Orien orien){vtkTransform transform = new vtkTransform();if(orien == Orien.X){transform.Translate(moveValue,0,0);}else if (orien == Orien.Y){transform.Translate(0, moveValue, 0);}else if (orien == Orien.Z){transform.Translate(0, 0, moveValue);}transform.Update();// 移动 模型TransformActor(model, transform);TransformActor(cenActor, transform);TransformActor(moveXEnd, transform);TransformActor(moveYEnd, transform);TransformActor(moveZEnd, transform);TransformActor(moveX, transform);TransformActor(moveY, transform);TransformActor(moveZ, transform);TransformActor(rotX, transform);TransformActor(rotY, transform);TransformActor(rotZ, transform);}

        public void TransformActor(vtkActor actor,  vtkTransform transform){vtkTransformFilter filter = new vtkTransformFilter();filter.SetTransform(transform);filter.SetInputData(actor.GetMapper().GetInput());filter.Update();actor.GetMapper().GetInput().DeepCopy(filter.GetOutput());}

(记得每一个交互的Actor 都要进行这个操作一起移动,包括定位小球)

X 轴旋转交互

使用 vtkRegularPolygonSource 创建空间圆 rotX, norm 为 (1,0,0)

 public vtkActor CircleActor(Point3d center, Point3d norm, double radius, double[] color){vtkRegularPolygonSource polygonSource = new vtkRegularPolygonSource();polygonSource.SetCenter(center.X, center.Y, center.Z);polygonSource.SetNormal(norm.X, norm.Y, norm.Z);polygonSource.SetRadius(radius);polygonSource.SetNumberOfSides(30);polygonSource.SetGeneratePolyline(1);polygonSource.SetGeneratePolygon(0);polygonSource.Update();vtkPolyDataMapper mapper = new vtkPolyDataMapper();mapper.SetInputData(polygonSource.GetOutput());mapper.Update();vtkActor actor = new vtkActor();actor.SetMapper(mapper);actor.GetProperty().SetColor(color[0], color[1], color[2]);actor.GetProperty().SetLineWidth(10);return actor;}

其他操作与移动相同。

不同的是旋转时和移动相关Actor不旋转的,为了保持永远在X 方向上移动。

(如果想在任意方向上移动可以计算移动时的方向向量,此时全部Actor旋转)

旋转代码

 public void RotateAllAcotr(double rotAngel, Point3d norm, Orien orien){Point3d center = new Point3d(cenActor.GetCenter());vtkTransform transform = new vtkTransform();transform.Translate(-center.X, -center.Y, -center.Z);if (orien == Orien.X){transform.RotateWXYZ(rotAngel, norm.X, norm.Y, norm.Z);}else if (orien == Orien.Y){transform.RotateWXYZ(rotAngel, norm.X, norm.Y, norm.Z);}else if (orien == Orien.Z){transform.RotateWXYZ(rotAngel, norm.X, norm.Y, norm.Z);}transform.Translate(center.X, center.Y, center.Z);transform.Update();TransformActor(model, transform);TransformActor(cenActor, transform);TransformActor(rotX, transform);TransformActor(rotY, transform);TransformActor(rotZ, transform);}
        public void TransformActor(vtkActor actor,  vtkTransform transform){vtkTransformFilter filter = new vtkTransformFilter();filter.SetTransform(transform);filter.SetInputData(actor.GetMapper().GetInput());filter.Update();actor.GetMapper().GetInput().DeepCopy(filter.GetOutput());}

这只是个简单的基本方法有不足的地方,其中有很过细节可以根据需要进行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言---数据结构(1)--时间复杂和空间复杂度计算

1.什么是时间复杂度和空间复杂度 1.1算法效率 算法效率分为时间效率和空间效率 时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算…

机器人阻抗控制相关文献学习(阻抗实现)

机器人阻抗是一个描述机器人与环境交互时动态特性的概念。 定义: 阻抗在机器人领域中,通常用来描述机器人与其环境之间的相互作用。当机器人与环境接触时,环境对机器人施加一个作用力,而机器人也会对环境施加一个反作用力。这个反…

PMP与软考的区别? 我该学习哪个?

PMP(项目管理专业人士)和软考(软件工程师考试)是两种不同领域的认证考试,分别专注于项目管理和软件工程师领域。下面将对它们做详细介绍。 一、PMP PMP作为项目管理领域的国际认证考试,由美国项目管理协会…

WordPress CDN是什么?CDN有什么作用?

您想让您的网站加载速度更快吗? 网站所有者希望网站加载速度快,内容丰富,功能强大,吸引用户。然而,添加这些功能可能会降低网站速度,难以快速向全球用户提供内容。 这就是为什么许多WordPress网站使用 CDN…

小型数据中心是什么?如何建设?

在数字化时代,小型数据中心正成为许多企业和组织加强数据管理和服务扩展的理想选择。与传统大型数据中心相比,小型数据中心以其灵活性、高效性和相对较低的运营成本吸引着越来越多的关注。然而,要成功建设一个小型数据中心,并确保…

Web网页端IM产品RainbowChat-Web的v7.0版已发布

一、关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统)。 ► 详细介绍:http://www.52im.net/thread-2…

特氟龙FEP离心管50ml30ml圆底赛默飞耐酸碱Thermo3114-0050离心管

FEP离心管:又叫聚全氟乙丙烯离心管,特氟龙离心管,F46离心管等。 其主要特性有: 1、可耐高温205℃、耐腐蚀性、不吸附性、透明可见、方便实验操作; 2、可适配于国内外各厂家离心机使用。 3、内壁光滑,不…

解决安全规模问题:MinIO 企业对象存储密钥管理服务器

在强大可靠的存储解决方案领域,MinIO 作为持久层脱颖而出,为组织提供安全、持久和可扩展的存储选项。MinIO 通常负责处理关键任务数据,在确保高可用性方面发挥着至关重要的作用,有时甚至在全球范围内。存储数据的性质,…

电路学习——经典运放电路(2024.06.21)

参考链接1: 11个经典运放电路 在此感谢各位前辈大佬的总结,写这个只是为了记录学习大佬资料的过程,内容基本都是搬运的大佬博客,觉着有用自己搞过来自己记一下,如果有大佬觉着我搬过来不好,联系我删。 电路学习——经典…

振弦式渗压计:土壤力学与地下水流动研究的关键工具

当谈论到地下水流动和土壤力学时,振弦式渗压计是一种至关重要的工具。这篇文章将探讨振弦式渗压计的原理、工作方式以及其在土壤力学和地下水流动研究中的重要性。 振弦式渗压计的原理 振弦式渗压计利用了振动传感器和压力传感器的组合来测量土壤中的水压力。其基本…

车联网全方位安全适配与领先架构

设想一下如下场景: 您钟爱的座驾,在毫无外力破坏迹象的情况下,突然被侵入,远程启动,然后绝尘而去… 别以为这只是大银幕上的虚构桥段,事实上,这一幕在现实中已经上演。 某款备受欢迎的车型&a…

职场新宠:ONLYOFFICE——办公协作的得力助手

🎠前言 在快节奏的职场环境中,高效、便捷的办公软件成为每一位职场人士不可或缺的工作伙伴。当我们谈论职场办公软件时,许多人首先会想到Microsoft Office、wps等老牌软件。 然而,有一款宝藏的办公软件ONLYOFFICE,凭…

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index.…

Postgres 多实例实例部署方式(Windows)

复制之前数据库中的data文件 1、进入"服务",停止服务 2、直接复制data整个文件夹到另一个路径,打开"postgresql.conf"文件夹,修改port为其他端口 启动新的服务实例 1、cmd输入命名启动服务 pg_ctl -D "D:\PG\N…

前后端分离项目面试总结

一:是否登录状态 服务端登录的时候,给分配一个session用于存储数据,同时将sessionID返回给浏览器,浏览器通过cookie把sessionID存储起来,下次访问时携带上,服务端就可以通过sessionID来确定用户是否登录。 …

GD32 串口接受异常的几个原因

前面我们介绍过GD32 485发送时出现异常的最常见原因,有小伙伴反馈想要知道GD32 串口接受异常的可能原因,今天我们就来安排。 一、波特率异常导致收发出错 我们知道,串口是异步通讯接口,通讯双方或者多方都需要工作在相同波特率下…

【JS逆向百例】某点数据逆向分析,多方法详解

前言 最近收到粉丝的私信,其在逆向某个站点时遇到了些问题,在查阅资料未果后,来询问K哥,K哥一向会尽力满足粉丝的需求。网上大多数分析该站点的教程已经不再适用,本文K哥将提供 3 种解决方案,对于 webpack…

【unity小技巧】unity事件系统创建通用的对象交互的功能

文章目录 前言实现1. **InteractEvent 类**:2. **Interact 类**:3. **Player 类**:4. **Chest 类**: 工作流程说明:开单个箱子按钮触发打开很多箱子拾取物品(传参)参考完结 前言 游戏开发过程中…

ONLYOFFICE8.1版本桌面编辑器测评

OO官方链接点这里:ONLYOFFICE 文档 8.1 现已发布:功能全面的 PDF 编辑器、幻灯片版式、优化电子表格的协作等等 | ONLYOFFICE 博客 一、界面与用户体验 整体布局和设计的美观性、易用性: ONLYOFFICE 8.1 版本的桌面编辑器展现出了令人眼前一亮…