VTK知识学习(33)-交互问题2

1、前言

主要是针对前面有过实现不了交互的情况进行说明,经过一些尝试和分析调用API,总算实现RenderWindowControl函数回调正常串接,当然这个移动处理事件的效果目前也没有确认。

2、使用

cs 复制代码
 vtkImageReslice reslice = vtkImageReslice.New();
        private void TestInteractorStyle()
        {
            vtkMetaImageReader reader = vtkMetaImageReader.New();
            reader.SetFileName("F:\\code\\VTK\\TestActiViz\\bin\\Debug\\data\\brain.mhd");
            reader.Update();

            int[] extent = reader.GetOutput().GetExtent();
            double[] spacing = reader.GetOutput().GetSpacing();
            double[] origin = reader.GetOutput().GetOrigin();

            double[] center = new double[3];
            center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
            center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
            center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);

            double[] axialElements ={
               1, 0, 0, 0,
               0, 1, 0, 0,
               0, 0, 1, 0,
               0, 0, 0, 1
           };//提取平行于YZ平面的切片

            IntPtr ptrData = Marshal.AllocHGlobal(sizeof(double) * axialElements.Length);
            Marshal.Copy(axialElements, 0, ptrData, axialElements.Length);
            vtkMatrix4x4 resliceAxes = vtkMatrix4x4.New();
            resliceAxes.DeepCopy(ptrData);
            resliceAxes.SetElement(0, 3, center[0]);
            resliceAxes.SetElement(1, 3, center[1]);
            resliceAxes.SetElement(2, 3, center[2]);

           
            reslice.SetInputData(reader.GetOutput());
            reslice.SetOutputDimensionality(2);
            reslice.SetResliceAxes(resliceAxes);
            reslice.SetInterpolationModeToLinear(); //指定切面提取中的插值方式为线性插值
            reslice.Update();

            vtkLookupTable colorTable = vtkLookupTable.New();
            colorTable.SetRange(0, 1000);
            colorTable.SetValueRange(0, 1);
            colorTable.SetSaturationRange(0, 0);
            colorTable.SetRampToLinear();
            colorTable.Build();

            vtkImageMapToColors colorMap = vtkImageMapToColors.New();
            colorMap.SetLookupTable(colorTable);
            colorMap.SetInputConnection(reslice.GetOutputPort());
            colorMap.Update();

            vtkImageActor orgActor = vtkImageActor.New();
            orgActor.SetInputData(colorMap.GetOutput());

            vtkRenderer renderer3 = vtkRenderer.New();
            renderer3.AddActor(orgActor);
            renderer3.ResetCamera();
            renderer3.SetBackground(0.4, 0.5, 0.6);

            vtkRenderWindow renderWindow = renderWindowControl.RenderWindow;
            //vtkImageViewer2 imageViewer = vtkImageViewer2.New();
            //imageViewer.SetSize(500, 500);
            //vtkRenderWindow renderWindow = imageViewer.GetRenderWindow();
            renderWindow.AddRenderer(renderer3);

            vtkRenderWindowInteractor windowInteractor = renderWindow.GetInteractor();

            windowInteractor.MouseMoveEvt += ImageStyle_MouseMoveEvt;
            windowInteractor.LeftButtonPressEvt += ImageStyle_LeftButtonPressEvt;
            windowInteractor.LeftButtonReleaseEvt += ImageStyle_LeftButtonReleaseEvt;

            renderWindow.Render();
        }

实现事件回调的对象是通过控件对象获取:

这个事件回调处理逻辑就不在复核。你可以自由发挥。

在事件回调的sender是vtkRenderWindowInteractor,你可以按你的设计去获取或设置一些参数来实现你的想法了。

3、总结

我尝试过重写这个鼠标事件,可是一个也不触发 ,想了想还是内部没有下发的问题。

再看这个vteRenderWindow可以获取到交互对象,就把这个交互对象拿出来进行注册事件就可以了。

猜想可能是这个事件传递到他这里就不下发了(当然啊也可能是一些设置没有开启)。毕竟他这个上面有这么些方法,不过后面还有机会打交道的。

类注释:

platform-independent render window interaction including picking and frame rate control. vtkRenderWindowInteractor provides a platform-independent interaction mechanism for mouse/key/time events. It serves as a base class for platform-dependent implementations that handle routing of mouse/key/timer messages to vtkInteractorObserver and its subclasses. vtkRenderWindowInteractor also provides controls for picking, rendering frame rate, and headlights. vtkRenderWindowInteractor has changed from previous implementations and now serves only as a shell to hold user preferences and route messages to vtkInteractorStyle. Callbacks are available for many events.

Platform specific subclasses should provide methods for manipulating timers, TerminateApp, and an event loop if required via Initialize/Start/Enable/Disable.

独立于平台的渲染窗互,包括拾取和帧速率控制。

vtkRenderWindowInteractor 为鼠标/键/时间事件提供了一种独立于平台的交互机制。它用作平台相关实现的基类,这些实现处理将鼠标/键/计时器消息路由到 vtkInteractorObserver 及其子类。

vtkRenderWindowInteractor 还提供了用于拾取、渲染帧速率和前照灯的控件。

vtkRenderWindowInteractor 与以前的实现不同,现在仅用作 shell,用于保存用户首选项并将消息路由到 vtkInteractorStyle。回调可用于许多事件。

特定于平台的子类应提供用于操作计时器、TerminateApp 和事件循环的方法(如果需要)通过 Initialize/Start/Enable/Disable。

相关推荐
青柠之夏cc8 小时前
AI与教育:个性化学习助手让“因材施教“成为现实,但代价是隐私?
人工智能·学习
for_ever_love__9 小时前
机器学习入门——手写线性回归与梯度下降
人工智能·python·学习·机器学习·线性回归
在猴站学算法9 小时前
(SQL注入学习)无回显的报错注入(Error-Based)
学习·网络安全·sql注入·ctf竞赛
知识分享小能手11 小时前
C++ 学习教程,从入门到精通,C++ 友元、异常和其他特性 — 详细知识点(15)
开发语言·c++·学习
fanged11 小时前
Camera学习2(V4L2和Media Controller)(TODO)
学习
努力学习的代码小白13 小时前
源码学习15
学习
扶风ff14 小时前
求职笔试资料太散?用练题簿在线刷题,按岗位整理练习清单
前端·学习·小程序
乌暮15 小时前
JVM 原理与实践:从运行时数据区到线上故障排查
java·开发语言·jvm·后端·学习·面试
酬谢神明则必安16 小时前
git学习记录01
linux·git·学习