VTK观察者和picker学习--从源码中找解决方案

想实现如此一个功能,render中有数个actor,用鼠标点选其中一个时实现高亮通知!
首先能想到的当然是用picker,看看guid中的说明,这里似乎要用到propPicker,可惜并没找到专门对应于picker的实例,怎么使用呢?一头雾水。。。(这时就产生的畏惧心理,群里问了也没人搭理,只好硬着头皮写了,现在想来遇到问题首先是不能怕了!!)
纠结良久后,终于想着还是自己试着写吧,随便看了看文档,就看到有vtkPropPicker::GetActor()方法,想想有思路了开始行动吧~

第一篇:picker拾取并高亮通知

步骤一:先随便插入几个actor,用Source做为数据源~给上不同的Position和color~

1

 

步骤二:给propPicker添加observer,先查看propPicker和事件,感觉应该使用vtkCommand::EndPickEvent
              写回调函数,这个简单直接调用GetActor()方法,然后通过vtkActor::GetProperty()->SetColor()变色

//回调
class vtkPickCallback : public vtkCommand
{
public:
        static vtkPickCallback *New()
        { return new vtkPickCallback; }
        virtual void Execute(vtkObject *caller, unsigned long, void*)
        {
                vtkPropPicker  *picker = reinterpret_cast<vtkPropPicker*>(caller);
                vtkActor *pickActor = picker->GetActor();
                if (pickActor != 0)
                {
                        pickActor->GetProperty()->SetColor(1.0,0.0,0.0);
                }
        }
};

//add picker and Observer
vtkPropPicker *picker = vtkPropPicker::New();
vtkPickCallback *myCallback = vtkPickCallback::New();
picker->AddObserver(vtkCommand::EndPickEvent, myCallback);

编译调试。。。。按p拾取,没反应,在回调中加断点,无法进入。。。后来又仔细看了遍文档发现原来RenderWindowInteractor里面有内置的picker,也就是说一直以来都是那个内置的picker的EndPickEvent被触发了~添加iren->SetPicker(picker);

 

2

 

OK一切正常,心中一阵窃喜,没想到如此简单就完成一半的工作了,看来还是要真正自己动手啦~

第二篇:鼠标点选触发picker拾取事件
当然这样还是不行的,用p才能拾取交互性也太差了~下面要做的就是实现鼠标点选拾取,看来要给LeftButtonPressEvent添加observer

步骤三
先设计回调函数,从文档中查到,RenderWindowInteractor::InvokeEvent()方法,可以通过程序来手动添加事件(新手就是要多查文档,看书查出来,领悟出来的东西往往是最容易掌握的),具体使用方法如下:
class vtkButtonCallback : public vtkCommand
{
public:
        static vtkButtonCallback *New()
        { return new vtkButtonCallback; }
        virtual void Execute(vtkObject *caller, unsigned long, void*)
        {
                vtkRenderWindowInteractor  *iren = reinterpret_cast<vtkRenderWindowInteractor*>(caller);
                int *pos = new int[2];
                iren->SetKeyCode('p');
                iren->InvokeEvent(vtkCommand::CharEvent,NULL);
                //虽然可以InvokeEvent,但每次启动时都必须先,按下任一快捷键(如't'),才能够真正触发事件!
        }
};

//Add observer
vtkButtonCallback *myBtnCallback = vtkButtonCallback::New();
iren->AddObserver(vtkCommand:eftButtonPressEvent, myBtnCallback);

编译。。运行。。鼠标点击无反应。。vtkButtonCallback 中加断点,能进入;vtk

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值