VTK可视化管线之实现观察者/命令(Observer/Command)设计模式

本文介绍如何使用VTK库实现观察者/命令设计模式,通过vtkBoxWidget控制一个三维锥体的变形。该示例展示了如何创建vtkBoxWidget并设置其观察者来响应交互事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VTK可视化管线之实现观察者/命令(Observer/Command)设计模式

#include"vtkSmartPointer.h"

#include"vtkConeSource.h"
#include"vtkPolyDataMapper.h"
#include"vtkRenderWindow.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkCamera.h"
#include"vtkActor.h"
#include"vtkRenderer.h"
#include"vtkCommand.h"
#include"vtkBoxWidget.h"
#include"vtkTransform.h"
#include"vtkInteractorStyleTrackballCamera.h"
 //第一步
class vtkMyCallback : public vtkCommand{
public:
       static vtkMyCallback *New(){ return new vtkMyCallback; }
       virtual void Execute(vtkObject *caller, unsigned long eventId, void* callData){
       vtkTransform *t = vtkTransform::New();
       vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget*>(caller);
       widget->GetTransform(t);
       widget->GetProp3D()->SetUserTransform(t);
       t->Delete();
         }
  };

 int main(){
     vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
     cone->SetHeight(3.0);
     cone->SetRadius(1.0);
cone->SetResolution(10);
vtkSmartPointer<vtkPolyDataMapper> coneMapper =
     vtkSmartPointer<vtkPolyDataMapper>::New();
     coneMapper->SetInputConnection(cone->GetOutputPort());
     vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
     coneActor->SetMapper(coneMapper);
     vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
     ren1->AddActor(coneActor);
     ren1->SetBackground(0.1, 0.2, 0.4);
     vtkSmartPointer<vtkRenderWindow> renWin =
     vtkSmartPointer<vtkRenderWindow>::New();
     renWin->AddRenderer(ren1);
     renWin->SetSize(300, 300);
     vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
     iren->SetRenderWindow(renWin);
     vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();

     iren->SetInteractorStyle(style);

   //通过vtkBoxWidget可以控制coneActor的变换矩阵,从而实现coneActor的形变
     vtkSmartPointer<vtkBoxWidget> boxWidget = vtkSmartPointer<vtkBoxWidget>::New();
     boxWidget->SetInteractor(iren);
     boxWidget->SetPlaceFactor(1.25);
boxWidget->SetProp3D(coneActor);
boxWidget->PlaceWidget();

  //第二步
vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New();

   //第三步
boxWidget->AddObserver(vtkCommand::InteractionEvent, callback);
  //激活Widget。按“i”键可以关闭或激活Widget。
     boxWidget->On();

iren->Initialize();
     iren->Start();
    return 0;

}

运行结果:

  

学习链接:https://blog.youkuaiyun.com/www_doling_net/article/details/8540242(东灵工作)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值