本人从2023年开始使用vtk+C#的模式开发桌面端三维应用,也就是利用vtk的.net版本ActiViz。
可以说这是一个非常不错的类库!!
以下是最近我用了一周时间开发的一个类似谷歌地球的桌面端程序,挺好玩的!(下面有视频演示!)
后面的博客里,我会上传源代码,请持续关注本人的博客!!
(以下是演示视频)
X3D虚拟地球演示
在开发过程中,踩坑不断,而网上的解决方案基本上都是抄来抄去,大部分不管用,读起来令人恼火!!我会在今后的文章中不断分享经实践成功的方法。
今天介绍事件响应机制回调函数的写法,网上(包括各种大模型)给出的方法基本都是照着C++的方法拔下来的,要么是使用vtkCallBackCommand或者是继承vtkCommand类,然后重载Execute方法,都不管用,结果就是报错!!!
正确的方法应该是针对控件里这个vtkRenderWindowInteractor对象添加事件处理函数!
下面给出具体代码:
this.Interactor = this.renderWindowControl1.RenderWindow.GetInteractor();
this.InteractorHandler = new Kitware.VTK.vtkObject.vtkObjectEventHandler(Interactor_AnyEventHandler);
this.Interactor.AnyEvt += this.InteractorHandler;
上面实际上是把在这个Interactor上的任何事件(AnyEvt )都转给InteractorHandler去处理,而InteractorHandler是通过Interactor_AnyEventHandler来完成处理过程的。
Interactor_AnyEventHandler的函数实现方法如下:
private void Interactor_AnyEventHandler(vtkObject sender, vtkObjectEventArgs e)
{
uint id = e.EventId; //获得事件ID
string eventName = vtkCommand.GetStringFromEventId(e.EventId); //获得事件名称
if (e.EventId==vtkCommand.EventIds.MouseMoveEvent)
{
int[] pos = this.Interactor.GetEventPosition(); //获得鼠标当前位置
//....
}
}
大家可以看到了,在这里面我们处理了鼠标移动事件,而其它事件也是类似的,vtkCommand的EventIds有很多事件ID,都可以照此模式处理!
附件:事件ID
AbortCheckEvent = 10,
ActiveCameraEvent = 29,
AnimationCueTickEvent = 59,
AnnotationChangedEvent = 78,
AnyEvent = 1,
Button3DEvent = 122,
CharEvent = 22,
Clip3DEvent = 132,
ComputeVisiblePropBoundsEvent = 84,
ConfigureEvent = 24,