ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

VTK开发笔记(九):示例Cone6,使用3D交互控件,在Qt窗口中详解复现对应的Demo

2026/8/21 12:50:29 拓冰建站 浏览量
VTK开发笔记(九):示例Cone6,使用3D交互控件,在Qt窗口中详解复现对应的Demo 若该文为原创文章转载请注明出处本文章博客地址https://hpzwl.blog.csdn.net/article/details/155466101长沙红胖子Qt长沙创微智科博文大全开发技术集合包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等持续更新中…OSG、VTK、OSGEARTH三维开发专栏点击传送门上一篇《VTK开发笔记八示例Cone5交互器的实现方式在Qt窗口中详解复现对应的Demo》下一篇《VTK开发笔记十VTK介绍Qt5.15.2VS2019x64VTK9.1编译》前言本篇详细解析Cone6.exe了解预定义的交互器操作。DemoVTK的3D交互控件概述VTKVisualization Toolkit提供了丰富的3D交互控件用于实现对 3D 场景的旋转、平移、缩放等操作以及自定义交互逻辑。这些控件是构建交互式可视化应用的核心组件。常用交互样式和功能vtkInteractorStyleTrackballCamera默认样式功能通过操作相机Camera来改变视图适用于观察整个场景。交互方式左键拖拽旋转相机场景绕视角中心旋转。中键/滚轮缩放相机靠近/远离场景。右键拖拽平移相机场景整体平移。vtkInteractorStyleTrackballActor功能直接操作场景中的演员Actor而非相机适用于编辑单个对象的位置和姿态。交互方式左键拖拽旋转选中的Actor。中键/滚轮缩放选中的Actor改变其大小。右键拖拽平移选中的Actor。注意需要先通过SetCurrentActor()指定要操作的Actor。vtkInteractorStyleJoystickCamera与vtkInteractorStyleJoystickActor功能与Trackball 系列类似但交互方式更接近“摇杆”逻辑——鼠标移动的方向和距离直接映射为旋转/平移的增量而非持续拖拽。适用场景需要更精准控制的交互如医疗影像中的精细调整。vtkInteractorStyleFlight功能模拟飞行视角通过鼠标和键盘控制相机的移动方向和速度适用于漫游大型场景如地形、城市模型。交互方式左键拖拽改变飞行方向。键盘W/S加速/减速。键盘A/D左右平移。vtkInteractorStyleImage功能专为2D图像如切片数据设计支持切片的平移、缩放和层切换适用于CT/MRI等医学影像的断层浏览。交互方式左键拖拽平移图像。中键/ 滚轮缩放图像。 右键拖拽切换切片沿 Z 轴方向。vtkBoxWidget交互控件概述创建一个可交互的立方体框6个面、12条边、8个顶点。通过拖拽顶点、边或面来调整立方体的大小和姿态。实时获取立方体的变换矩阵用于控制关联对象的位置、旋转和缩放。框选场景中的部分对象进行操作。对体数据或网格模型进行立方体裁剪。交互式调整对象的包围盒Bounding Box。作为变换工具控制模型的缩放、旋转和平移。交互操作vtkBoxWidget提供了丰富的交互操作通过鼠标拖拽不同组件实现拖拽顶点调整立方体的角点位置改变局部大小。拖拽边沿边的方向拉伸或压缩立方体。拖拽面沿面的法线方向移动整个面改变立方体的整体尺寸。Ctrl 拖拽面/边/顶点保持立方体的比例缩放。Shift 拖拽仅平移立方体不改变大小和方向。右键点击弹出上下文菜单支持重置、对齐轴等操作需开启默认 Representation。关键参数与方法Demo实现步骤步骤一创建圆锥数据源步骤二创建多边形映射步骤三创建演员步骤四创建渲染器步骤五设置渲染器到渲染窗口步骤六关键设置boxWidget交互器Demo源码VTKWidget.cppvoidVTKWidget::test_demo8_createCone(VTKManager::INTERACTOR_STYLE interactorStyle){// 步骤一创建圆锥体数据源vtkSmartPointervtkConeSourcepConeSourceVTKManager::createConeSource(0,0,0,10,30,100);// 步骤二创建多边形映射器vtkSmartPointervtkPolyDataMapperpPolyDataMapperVTKManager::createPolyDataMapper(pConeSource-GetOutputPort());// 步骤三创建演员vtkSmartPointervtkActorpActorVTKManager::createActor(pPolyDataMapper,0.5,0.3,0.2);// 步骤四创建渲染器vtkSmartPointervtkRendererpRendererVTKManager::createRenderer(pActor,0.1,0.1,0.1);// 步骤五设置渲染器到QVTKWidget渲染窗口_pQVTKWidget-GetRenderWindow()-AddRenderer(pRenderer);// 步骤六设置交互器VTKManager::createRenderWindowInteractorBoxWidget(_pQVTKWidget-GetRenderWindow(),pActor,interactorStyle);}VTKManager.hpublic:/** 预定义的交互器类型 * 操作对象摄像机 vs 演员交互连续性平滑 Trackball vs 步进 Joystick场景类型图像、地形、通用 3D 等。 * 实际使用时可根据具体场景选择合适的样式或基于 vtkInteractorStyleUser 扩展自定义交互逻辑。 */enumINTERACTOR_STYLE{// 基础交互器样式INTERACTOR_STYLE_TRACKBALL_CAMERA0x00,// 摄像机 鼠标左键旋转、中键平移、右键 / 滚轮缩放交互平滑连续类似 “轨迹球” 效果通用 3D 场景浏览操作摄像机以改变观察视角。INTERACTOR_STYLE_TRACKBALL_ACTOR,// 选中的演员 先点击选中演员再通过鼠标左键旋转、中键平移、右键缩放该演员。仅修改单个对象的姿态不改变摄像机位置。// 遥感式交互器样式INTERACTOR_STYLE_JOYSTICK_CAMERA,// 摄像机 类似TrackballCamera但交互是 “步进式”拖动鼠标后松开才执行操作而非连续平滑需要精确控制交互幅度的场景。INTERACTOR_STYLE_JOYSTICK_ACTOR,// 选中的演员 步进式操作单个演员与 JoystickCamera 逻辑类似但针对演员而非摄像机。// 图像与切片交互器样式INTERACTOR_STYLE_IMAGE,// 专为 2D/3D 图像如 CT、MRI 切片设计。交互方式左键平移图像、右键缩放、键盘 / 下键切换切片层默认禁用摄像机旋转保持正交视角。扩展功能支持图像窗宽窗位调整通过键盘或鼠标。// 选择与区域操作样式INTERACTOR_STYLE_RUBBER_BAND_ZOOM,// 核心功能支持 “框选缩放”—— 拖动鼠标绘制矩形区域场景自动缩放至该区域。适用场景快速聚焦到局部区域如病灶、细节。INTERACTOR_STYLE_RUBBER_BAND_PICK,// 支持框选区域内的对象如演员、点集配合拾取器Picker使用。INTERACTOR_STYLE_DRAW_POLYGON,// 支持用鼠标绘制多边形区域用于复杂区域的选择或裁剪。// 特殊场景与特殊场景样式INTERACTOR_STYLE_TERRAIN,// 专为地形数据如高程图、地形模型设计。交互方式模拟 “在地形上行走”支持前后移动、左右转向避免摄像机穿入地形。INTERACTOR_STYLE_FLIGHT,// 模拟 “飞行” 视角通过鼠标控制飞行方向和速度适合大规模场景如城市、地形浏览。INTERACTOR_STYLE_UNICAM,// 基于 “单摄像机” 模型优化了 3D 交互的直观性减少操作歧义。// 扩展与集成样式INTERACTOR_STYLE_USER,// 用于自定义交互逻辑的基类可通过重写事件回调函数实现个性化操作。INTERACTOR_STYLE_SWITCH,// 支持动态切换多种交互器样式如在 Trackball 和 Image 样式间切换。};VTKManager.cppvtkSmartPointervtkConeSourceVTKManager::createConeSource(doublex,doubley,doublez,doubler,inth,intn){// 步骤一智能指针定义vtkSmartPointervtkConeSourcepConeSource;// 步骤二智能指针实例化pConeSourcevtkSmartPointervtkConeSource::New();// 步骤三设置中心坐标pConeSource-SetCenter(x,y,z);// 步骤三设置半径pConeSource-SetRadius(r);// 步骤四设置圆锥的高度pConeSource-SetHeight(h);// 步骤五设置圆锥球体的经度分辨率即横向的切片数量横向/水平精细度pConeSource-SetResolution(n);returnpConeSource;}vtkSmartPointervtkPolyDataMapperVTKManager::createPolyDataMapper(vtkAlgorithmOutput*pAlgorithmOutput){// 步骤一智能指针定义vtkSmartPointervtkPolyDataMapperpPolyDataMapper;// 步骤二智能指针实例化pPolyDataMappervtkSmartPointervtkPolyDataMapper::New();// 步骤三设置pPolyDataMapper-SetInputConnection(pAlgorithmOutput);returnpPolyDataMapper;}vtkSmartPointervtkActorVTKManager::createActor(vtkPolyDataMapper*pPolyDataMapper,doubler,doubleg,doubleb){// 步骤一智能指针定义vtkSmartPointervtkActorpActor;// 步骤二智能指针实例化pActorvtkSmartPointervtkActor::New();// 步骤三设置映射器pActor-SetMapper(pPolyDataMapper);// 步骤四设置颜色pActor-GetProperty()-SetColor(r,g,b);returnpActor;}vtkSmartPointervtkRendererVTKManager::createRenderer(std::vectorvtkActor*vectorPActor,doubler,doubleg,doubleb){// 步骤一智能指针定义vtkSmartPointervtkRendererpRenderer;// 步骤二智能指针实例化pRenderervtkSmartPointervtkRenderer::New();// 步骤三设置映射器for(intindex0;indexvectorPActor.size();index){pRenderer-AddActor(vectorPActor.at(index));}// 步骤四设置背景色pRenderer-SetBackground(r,g,b);returnpRenderer;}vtkSmartPointervtkRenderWindowInteractorVTKManager::createRenderWindowInteractorBoxWidget(vtkRenderWindow*pRenderWindow,vtkActor*pActor,VTKManager::INTERACTOR_STYLE interactorStyle){// 步骤一智能指针定义、实例化vtkSmartPointervtkRenderWindowInteractorpRenderWindowInteractorvtkSmartPointervtkRenderWindowInteractor::New();// 步骤二智能指针定义、实例化vtkSmartPointervtkInteractorObserverpInteractorObserver;// 步骤三设置交换器switch(interactorStyle){// 基础交互器样式caseINTERACTOR_STYLE_TRACKBALL_CAMERA:// 摄像机 鼠标左键旋转、中键平移、右键 / 滚轮缩放交互平滑连续类似 “轨迹球” 效果通用 3D 场景浏览操作摄像机以改变观察视角。pInteractorObservervtkSmartPointervtkInteractorStyleTrackballCamera::New();break;caseINTERACTOR_STYLE_TRACKBALL_ACTOR:// 选中的演员 先点击选中演员再通过鼠标左键旋转、中键平移、右键缩放该演员。仅修改单个对象的姿态不改变摄像机位置。pInteractorObservervtkSmartPointervtkInteractorStyleTrackballActor::New();break;// 遥感式交互器样式caseINTERACTOR_STYLE_JOYSTICK_CAMERA:// 摄像机 类似TrackballCamera但交互是 “步进式”拖动鼠标后松开才执行操作而非连续平滑需要精确控制交互幅度的场景。pInteractorObservervtkSmartPointervtkInteractorStyleJoystickCamera::New();break;caseINTERACTOR_STYLE_JOYSTICK_ACTOR:// 选中的演员 步进式操作单个演员与 JoystickCamera 逻辑类似但针对演员而非摄像机。pInteractorObservervtkSmartPointervtkInteractorStyleJoystickActor::New();break;// 图像与切片交互器样式caseINTERACTOR_STYLE_IMAGE:// 专为 2D/3D 图像如 CT、MRI 切片设计。交互方式左键平移图像、右键缩放、键盘 / 下键切换切片层默认禁用摄像机旋转保持正交视角。扩展功能支持图像窗宽窗位调整通过键盘或鼠标。pInteractorObservervtkSmartPointervtkInteractorStyleImage::New();break;// 选择与区域操作样式caseINTERACTOR_STYLE_RUBBER_BAND_ZOOM:// 核心功能支持 “框选缩放”—— 拖动鼠标绘制矩形区域场景自动缩放至该区域。适用场景快速聚焦到局部区域如病灶、细节。pInteractorObservervtkSmartPointervtkInteractorStyleRubberBandZoom::New();break;caseINTERACTOR_STYLE_RUBBER_BAND_PICK:// 支持框选区域内的对象如演员、点集配合拾取器Picker使用。pInteractorObservervtkSmartPointervtkInteractorStyleRubberBandPick::New();break;caseINTERACTOR_STYLE_DRAW_POLYGON:// 支持用鼠标绘制多边形区域用于复杂区域的选择或裁剪。pInteractorObservervtkSmartPointervtkInteractorStyleDrawPolygon::New();break;// 特殊场景与特殊场景样式caseINTERACTOR_STYLE_TERRAIN:// 专为地形数据如高程图、地形模型设计。交互方式模拟 “在地形上行走”支持前后移动、左右转向避免摄像机穿入地形。pInteractorObservervtkSmartPointervtkInteractorStyleTerrain::New();break;caseINTERACTOR_STYLE_FLIGHT:// 模拟 “飞行” 视角通过鼠标控制飞行方向和速度适合大规模场景如城市、地形浏览。pInteractorObservervtkSmartPointervtkInteractorStyleFlight::New();break;caseINTERACTOR_STYLE_UNICAM:// 基于 “单摄像机” 模型优化了 3D 交互的直观性减少操作歧义。pInteractorObservervtkSmartPointervtkInteractorStyleUnicam::New();break;// 扩展与集成样式caseINTERACTOR_STYLE_USER:// 用于自定义交互逻辑的基类可通过重写事件回调函数实现个性化操作。pInteractorObservervtkSmartPointervtkInteractorStyleUser::New();break;caseINTERACTOR_STYLE_SWITCH:// 支持动态切换多种交互器样式如在 Trackball 和 Image 样式间切换。pInteractorObservervtkSmartPointervtkInteractorStyleSwitch::New();break;default:break;}pRenderWindowInteractor-SetInteractorStyle(pInteractorObserver);// 步骤四设置处理的渲染窗口pRenderWindowInteractor-SetRenderWindow(pRenderWindow);// 步骤五智能指针定义、实例化vtkSmartPointervtkBoxWidgetpBoxWidgetvtkSmartPointervtkBoxWidget::New();// 步骤六设置boxWidget的交互器pBoxWidget-SetInteractor(pRenderWindowInteractor);// 步骤七设置位置因子位置因子控制小部件相对于小部件输入边界框的初始大小。pBoxWidget-SetPlaceFactor(1.25);// 步骤八box添加控制的演员pBoxWidget-SetProp3D(pActor);// 步骤九pBoxWidget-PlaceWidget();// 步骤十定义观察者回调处理类、智能指针定义、实例化classvtkMyCallback:publicvtkCommand{public:staticvtkMyCallback*New(){returnnewvtkMyCallback;}voidExecute(vtkObject*caller,unsignedlong,void*)override{// 变换矩阵vtkTransform*pTransformvtkTransform::New();// 获取被观察这里是对BoxWidget添加观察者所以BoxWidget是被观察者vtkBoxWidget*pBoxWidgetreinterpret_castvtkBoxWidget*(caller);// 获取被观察者的举证pBoxWidget-GetTransform(pTransform);// 讲BoxWidget下的3D模型都设置为其变换的矩阵pBoxWidget-GetProp3D()-SetUserTransform(pTransform);// 删除pTransform-Delete();}};vtkSmartPointervtkMyCallbackpMyCallbackvtkSmartPointervtkMyCallback::New();// 步骤十一添加时间观察回调pBoxWidget-AddObserver(vtkCommand::InteractionEvent,pMyCallback);// 步骤十二启用BoxWidgetpBoxWidget-On();// 步骤十三初始化交互器pRenderWindowInteractor-Initialize();// 步骤十四开始进入交互器时间循环pRenderWindowInteractor-Start();returnpRenderWindowInteractor;}工程模板v1.7.0上一篇《VTK开发笔记八示例Cone5交互器的实现方式在Qt窗口中详解复现对应的Demo》下一篇《VTK开发笔记十VTK介绍Qt5.15.2VS2019x64VTK9.1编译》本文章博客地址https://hpzwl.blog.csdn.net/article/details/155466101