三维控件中定位一个点_vtkPointWidget


开发环境:

  1. Windows 11 家庭中文版
  2. Microsoft Visual Studio Community 2019
  3. VTK-9.3.0.rc0
  4. vtk-example
  5. 参考代码

demo解决问题:允许用户使用三维光标在三维空间中定位一个点。关键类vtkPointWidget , 光标具有轮廓边界框、轴对齐十字准线和轴阴影(轮廓和阴影可以关闭)。(可以关闭轮廓和阴影)。vtkPointWidget 和其他 3D widget 一样,具有一个很好的特点,即它可以与当前的交互样式一起工作。也就是说,如果 vtkPointWidget 没有处理事件,那么所有其他已注册的观察者(包括交互样式)都有机会处理该事件。否则,vtkPointWidget 将终止处理它所处理的事件。

在这里插入图片描述

主流程:(不看probe)

  1. 数据源1:构造一个网格化的sphereSource数据源
  2. 数据源2:point的位置使用cone符号化为圆锥体
  3. 数据源3:添加一个AddActor2D,固定在视口左下角
  4. 数据源4:构造3D控件pointWidget,并添加观察者myCallback,监控pointWidget交互事件

注意:point符号化的过程中,一开始是没有符号的,所以圆锥体一开始不显示,交互时间开始后设置了point的值,点背符号化后有了圆锥体,Execute中关键代码:

//获取定义该点的多边形数据(包括点)。单个点和一个顶点组成 vtkPolyData。
pointWidget->GetPolyData(this->PolyData);//给this->PolyData / point 赋值,在多个管道中间中途修改值,修改后update修改过的管道,render
this->PositionActor->SetInput(text.str().c_str());

glyph的输入我把probefilter删了,直接用point数据,也是可以相同效果的,目前没有明白为什么要加一个vtkProbeFilter,理解的帮解答下,谢谢拉!!!

另一个需要重点关注的是需要区分以下接口接口

  vtkNew<vtkProbeFilter> probe;//指定一个数据对象作为输入。请注意,此方法不会建立管道连接。使用 SetInputConnection() 来 建立管道连接。probe->SetInputData(point);//输入: 此时的point值为空,需要事件内根据鼠标位置进行赋值//指定将在输入点进行探测的数据集。 //输入为输出提供几何图形(点和单元)、 而源点则通过探测(插值)生成标量、 矢量等。probe->SetSourceData(inputPolyData);//源: 

参考链接1
参考链接2
参考链接3

  vtkNew<vtkGlyph3D> glyph;// glyph->SetInputConnection(probe->GetOutputPort());//???不理解glyph->SetInputData(point); //此处直接使用point也可以达到效果,但是为什么非要用vtkProbeFilter 没有想通glyph->SetSourceConnection(cone->GetOutputPort());

参考链接1
参考链接2


prj name: Arbitrary3DCursor

#include <vtkActor.h>
#include <vtkCallbackCommand.h>
#include <vtkCommand.h>
#include <vtkConeSource.h>
#include <vtkGlyph3D.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointWidget.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProbeFilter.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
#include <vtkXMLPolyDataReader.h>#include <iostream>
#include <sstream>
#include <string>// This does the actual work: updates the probe.
// Callback for the interaction.
class vtkmyPWCallback : public vtkCallbackCommand
{
public:vtkmyPWCallback() = default;static vtkmyPWCallback* New(){return new vtkmyPWCallback;}virtual void Execute(vtkObject* caller, unsigned long, void*){vtkPointWidget* pointWidget = reinterpret_cast<vtkPointWidget*>(caller);//获取定义该点的多边形数据(包括点)。单个点和一个顶点组成 vtkPolyData。pointWidget->GetPolyData(this->PolyData);//给this->PolyData / point 赋值,在多个管道中间中途修改值,修改后update修改过的管道,renderdouble position[3];pointWidget->GetPosition(position);std::ostringstream text;text << "cursor: " << std::fixed << std::setprecision(4) << position[0]<< ", " << position[1] << ", " << position[2];this->PositionActor->SetInput(text.str().c_str());// this->CursorActor->VisibilityOn();std::cout << PolyData->GetNumberOfCells() << std::endl;std::cout << PolyData->GetNumberOfPoints() << std::endl;std::cout << PolyData->GetNumberOfPolys() << std::endl;}vtkPolyData* PolyData = nullptr;      //与传入的锥形有关//vtkActor* CursorActor = nullptr;    //可以不需要,如果需要控制显示隐藏状态,可以传入vtkTextActor* PositionActor = nullptr;//实时显示坐标状态
};int main(int argc, char* argv[])
{vtkSmartPointer<vtkPolyData> inputPolyData;if (argc > 1){vtkNew<vtkXMLPolyDataReader> reader;reader->SetFileName(argv[1]);reader->Update();inputPolyData = reader->GetOutput();}else{vtkNew<vtkSphereSource> sphereSource;sphereSource->SetPhiResolution(15);sphereSource->SetThetaResolution(15);sphereSource->Update();inputPolyData = sphereSource->GetOutput();}vtkNew<vtkNamedColors> colors;vtkNew<vtkPolyData> point;//https://blog.csdn.net/liushao1031177/article/details/122860254//https://blog.csdn.net/yuyangyg/article/details/78165570//https://www.cnblogs.com/ankier/p/3166210.html/*在指定点位置采样数据值vtkProbeFilter 是一个过滤器,用于计算指定点位置的点属性(如标量、矢量等)。该过滤器有两个输入:输入和源。输入的几何结构通过过滤器。通过对源数据进行插值,在输入点位置计算出点属性。例如,我们可以根据体积(源数据)计算平面(指定为输入的平面)上的数据值。源数据的单元格数据会根据每个输入点所在的源单元格复制到输出端。如果源点数据和单元格数据中都存在同名数组,则只探查点数据中的数组。该过滤器可用于重新采样数据,或将一种数据集形式转换为另一种数据集形式。例如,非结构化网格(vtkUnstructuredGrid)可以用体积(三维 vtkImageData)进行探测,然后使用体积渲染技术将结果可视化。另一个例子:可以使用一条直线或曲线来探测数据,以生成沿该直线或曲线的 x-y 图。警告vtkProbeFilter 的一个关键算法组件是其查找包含探测点的单元格的方式。默认情况下,vtkDataSet::FindCell() 方法会被使用,该方法反过来使用 vtkPointLocator 来执行加速搜索。不过,在某些情况下,使用 vtkPointLocator 可能无法识别包围单元格。更稳健但更慢的方法是使用 vtkCellLocator 执行 FindCell() 操作(通过指定 CellLocatorPrototype)。最后,可以通过指定 vtkFindCellStrategy 的实例来配置更高级的搜索。(注意:图像数据探测从不使用定位器,因为查找包含的单元格是一个简单、快速的操作。因此指定 vtkFindCellStrategy 或单元格定位器原型没有任何作用)。vtkProbeFilter 一旦找到包含查询点的单元格,就会使用单元格的插值函数来执行插值/计算点属性。vtkPointInterpolator 支持多种广义内核,而 vtkSPHInterpolator 则支持多种 SPH 内核。*/vtkNew<vtkProbeFilter> probe;//指定一个数据对象作为输入。请注意,此方法不会建立管道连接。使用 SetInputConnection() 来 建立管道连接。probe->SetInputData(point);//输入: 此时的point值为空,需要事件内根据鼠标位置进行赋值//指定将在输入点进行探测的数据集。 //输入为输出提供几何图形(点和单元)、 而源点则通过探测(插值)生成标量、 矢量等。probe->SetSourceData(inputPolyData);//源: std::cout << point->GetNumberOfCells() << std::endl;std::cout << point->GetNumberOfPoints() << std::endl;std::cout << point->GetNumberOfPolys() << std::endl;// Create glyph.vtkNew<vtkConeSource> cone;cone->SetResolution(30);//https://blog.csdn.net/jigetage/article/details/86633156//https://www.cnblogs.com/vaughnhuang/p/17584058.htmlvtkNew<vtkGlyph3D> glyph;// glyph->SetInputConnection(probe->GetOutputPort());//???不理解glyph->SetInputData(point); //此处直接使用point也可以达到效果,但是为什么非要用vtkProbeFilter 没有想通glyph->SetSourceConnection(cone->GetOutputPort());glyph->SetVectorModeToUseVector();glyph->SetScaleModeToDataScalingOff();glyph->SetScaleFactor(inputPolyData->GetLength() * 0.1);vtkNew<vtkPolyDataMapper> glyphMapper;glyphMapper->SetInputConnection(glyph->GetOutputPort());vtkNew<vtkActor> glyphActor;glyphActor->SetMapper(glyphMapper);glyphActor->VisibilityOn();//point为空,没有glyph显示vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputData(inputPolyData);vtkNew<vtkActor> actor;actor->SetMapper(mapper);actor->GetProperty()->SetRepresentationToWireframe();actor->GetProperty()->SetColor(colors->GetColor3d("gold").GetData());vtkNew<vtkTextActor> textActor;textActor->GetTextProperty()->SetFontSize(12);textActor->SetPosition(10, 20);textActor->SetInput("cursor:");textActor->GetTextProperty()->SetColor(colors->GetColor3d("White").GetData());// Create the RenderWindow, Render1er and both Actors.vtkNew<vtkRenderer> ren1;vtkNew<vtkRenderWindow> renWin;renWin->AddRenderer(ren1);vtkNew<vtkRenderWindowInteractor> iren;iren->SetRenderWindow(renWin);// The SetInteractor method is how 3D widgets are associated with the render// window interactor. Internally, SetInteractor sets up a bunch of callbacks// using the Command/Observer mechanism (AddObserver()).vtkNew<vtkmyPWCallback> myCallback;myCallback->PolyData = point;//myCallback->PolyData = inputPolyData;//myCallback->CursorActor = glyphActor;myCallback->PositionActor = textActor;// The point widget is used probe the dataset.vtkNew<vtkPointWidget> pointWidget;pointWidget->SetInteractor(iren);pointWidget->SetInputData(inputPolyData);//指定移动范围pointWidget->AllOff();pointWidget->PlaceWidget();pointWidget->AddObserver(vtkCommand::InteractionEvent, myCallback);ren1->AddActor(glyphActor);ren1->AddActor(actor);ren1->AddActor2D(textActor);//2D actor// Add the actors to the renderer, set the background and size.ren1->GradientBackgroundOn();ren1->SetBackground(colors->GetColor3d("SlateGray").GetData());ren1->SetBackground2(colors->GetColor3d("Wheat").GetData());renWin->SetSize(300, 300);renWin->SetWindowName("Arbitrary3DCursor");renWin->Render();pointWidget->On();// Render the imageiren->Initialize();renWin->Render();iren->Start();return EXIT_SUCCESS;
}

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

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

相关文章

AD7021C 触摸感应加灯光调节芯片IC 可用于触摸台灯、触摸玩具灯等

AD7021C触摸感应 IC 是为实现人体触摸界面而设计的集成电路。可替代机械式轻触按键&#xff0c;实现防水防尘、密封隔离、坚固美观的操作界面。使用该芯片可以实现 LED 灯光亮度调节&#xff0c;方案所需的外围电路简单&#xff0c;操作方便。确定好灵敏度选择电容&#xff…

【华为OD题库-033】经典屏保-java

题目 DVD机在视频输出时&#xff0c;为了保护电视显像管&#xff0c;在待机状态会显示"屏保动画”&#xff0c;如下图所示,DVD Logo在屏幕内来回运动&#xff0c;碰到边缘会反弹:请根据如下要求&#xff0c;实现屏保Logo坐标的计算算法 1、屏幕是一个800 * 600像素的矩形&…

Vue3 provide 和 inject 实现祖组件和后代组件通信

provide 和 inject 能够实现祖组件和其任意的后代组件之间通信&#xff1a; 一、provide 提供数据 我们在祖组件中使用provide 将数据提供出去。 使用provide 之前需要先进行引入&#xff1a; import { provide } from "vue"; 语法格式如下&#xff1a; provide(&q…

山西电力市场日前价格预测【2023-11-23】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-23&#xff09;山西电力市场全天平均日前电价为148.77元/MWh。其中&#xff0c;最高日前电价为420.40元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

微信小程序开发学习——页面布局、初始导航栏与跳转

1.盒模型 要求实现效果如图所示&#xff1a; 所有WXML元素都可以看作盒子&#xff0c;在WXSS中"box model”这一术语是用来设计和布局时使用盒模型本质上是一个盒子&#xff0c;封装周围的WXML元素它包括: 边距&#xff0c;边框&#xff0c;填充和实际内容&#xff0c;模…

RAW RGB YUV数据差异

目录 颜色与色彩空间 RAW图像 RGB图像 YUV图像 颜色与色彩空间 颜色 颜色是人眼感知到的现象&#xff0c;它是由光波的频率和强度所决定的&#xff0c;仅仅存在于人的眼睛和大脑中&#xff0c;因此为了方便描述颜色&#xff0c;引入了色彩空间。色彩空间 色彩空间&#xff…

C语言--数组与指针--打印字符串的n种方式

一.知识背景 一维数组名的含义 arr一般表示数组的起始地址&#xff08;除了两种例外&#xff09; 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表…

和鲸 × 暨大经管:高效 SAAS 服务持续赋能交叉学科应用型数据人才培养

随着新一轮科技革命与产业变革的加速演进&#xff0c;拥有学科背景的应用型数据科学人才逐渐成为我国政产学研各界的人力资源需求重点。为响应需求&#xff0c;国家愈发重视新生力量数据思维与意识的培养&#xff0c;各高校也纷纷探索如何以新兴信息技术赋能传统主流学科。 在…

达索系统SOLIDWORKS流体分析网格划分失败,大多是这2种原因

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件&#xff0c;该软件功能强大、操作人性化&#xff0c;快速轻松的分析产品内部或外部流体的流动情况&#xff0c;以用来改善产品性能和功能。 当流体分析运行网格划分时&#xff0c;提示失败。 这是由于凸起面与圆…

【LeetCode刷题】--43.字符串相乘

43.字符串相乘 方法一&#xff1a;做加法&#xff0c;模拟竖式乘法的方法计算乘积 class Solution {public String multiply(String num1, String num2) {if(num1.equals("0") || num2.equals("0")){return "0";}String res "0";//nu…

Hadoop -hdfs的读写请求

1、HDFS写数据&#xff08;宏观&#xff09;&#xff1a; 1、首先&#xff0c;客户端发送一个写数据的请求&#xff0c;通过rpc与NN建立连接&#xff0c;NN会做一些简单的校验&#xff0c;文件是否存在&#xff0c;是否有空间存储数据等。 2、NN就会将校验的结果发送给客户端…

解决requests库进行爬虫ip请求时遇到的错误的方法

目录 一、超时错误 二、连接错误 三、拒绝服务错误 四、内容编码错误 五、HTTP错误 在利用requests库进行网络爬虫的IP请求时&#xff0c;我们可能会遇到各种错误&#xff0c;如超时、连接错误、拒绝服务等等。这些错误通常是由目标网站的限制、网络问题或我们的爬虫代码中…

前端性能优化总结

这里写目录标题 页面性能测试工具测试指标 前端页面性能常见的问题前端页面性能优化常见策略及方案dns优化------预解析域名&#xff08;异步进行&#xff09;http请求优化减少请求次数同时多开持久连接 前面面试url从输入到确认搜索发生了什么js介绍new一个对象的过程&#xf…

Linux 进程等待

在2号手册里查wait&#xff08;&#xff09;。wait()等待任意一个子进程的状态。 wait&#xff08;&#xff09;等待成功会返回该子进程的id,返回失败会返回-1&#xff1a; 小实验 子进程的退出码 子进程执行work()&#xff0c;父进程wait子进程。 子进程跑完5秒之后就e…

GCANet_Gated context aggregation network for image dehazing and deraining

2019、中科大港科、有代码 Chen D, He M, Fan Q, et al. Gated context aggregation network for image dehazing and deraining[C]//2019 IEEE winter conference on applications of computer vision (WACV). IEEE, 2019: 1375-1383. GitHub - cddlyf/GCANet: Implementation…

丢掉破解版,官方免费了!!!

哈喽&#xff01;大家好。 几天不见&#xff0c;今天给大家带来一款海外的神器&#xff0c;官方宣布完全免费&#xff0c;但仅限于个人与教育用途&#xff0c;切勿商用噢&#xff01; 不要看这个软件名字普普通通&#xff0c;实际上内蕴乾坤&#xff01; 接下来看我给大家炫一…

队列的实现和OJ练习(c语言)

目录 概念 队列的实现 利用结构体存放队列结构 为什么单链表不使用这种方法&#xff1f; 初始化队列 小提示&#xff1a; 队尾入队列 队头出队列 获取队头元素 获取队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 最终代码 循环队列 队列的OJ题 …

元素清空操作clear与选择操作check

元素清空操作clear与选择操作check clear() 作用 清空输入框的所有内容.clear() 等价于 .type("{selectall}{backspace}") 语法 .clear() .clear(options)option选项 元素选中操作check与uncheck check 语法 // 所有匹配到的选择框都会被选中一遍 .check()/…

三、防火墙-源NAT

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 源NAT基本原理1.1.NAT No-PAT1.2.NAPT1.3.出接口地址方式&#xff08;Easy IP&#xff09;1.4.Smart NAT1.5.三元组 NAT1.6.多出口场景下的源NAT 总结延伸 ——————————————————————————————…

部署你的第一个应用

&#x1f5d3;️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f913;FastAPI 构建应用 #基于fastapi快速创建一个项目 rkun1LAPTOP-TUS5FU0D MINGW64 / $ mkdir k8s-appr…