This example uses a vtkBoxWidget2 to manipulate an actor. The widget only contains the interaction logic; the actual box is drawn by the accompanying vtkBoxRepresentation. Contrary to the older vtkBoxWidget, this widget doesn't provide functionality to assign it to one or more actors, so that has to be implemented manually. The box is dimensioned and positioned by passing a bounding box to PlaceWidget method, with the SetPlaceFactormethod providing a scaling factor in relation to that bounding box. The transformations applied to the box can be used to manipulate any number of object(s), via a custom callback class, which is passed to the box widget through the AddObserver method.

The older implementation vtkBoxWidget provides functionality to receive a vtkProp3D for the initial positioning and sizing, but the transformation synchronization still needs to be done manually. See BoxWidget for a simple example of how to use it.

vtkBoxWidget2

3D widget 用于操控 a box

This 3D widget interacts with a vtkBoxRepresentation class (i.e., it handles the events that drive its corresponding representation). The representation is assumed to represent a region of interest that is represented by an arbitrarily oriented hexahedron (or box) with interior face angles of 90 degrees (i.e., orthogonal faces). The representation manifests seven handles that can be moused on and manipulated, plus the six faces can also be interacted with. The first six handles are placed on the six faces, the seventh is in the center of the box. In addition, a bounding box outline is shown, the "faces" of which can be selected for object rotation or scaling. A nice feature of vtkBoxWidget2, like any 3D widget, will work with the current interactor style. That is, if vtkBoxWidget2 does not handle an event, then all other registered observers (including the interactor style) have an opportunity to process the event. Otherwise, the vtkBoxWidget will terminate the processing of the event that it handles.

To use this widget, you generally pair it with a vtkBoxRepresentation (or a subclass). Variuos options are available in the representation for controlling how the widget appears, and how the widget functions.

Event Bindings:
By default, the widget responds to the following VTK events (i.e., it watches the vtkRenderWindowInteractor for these events):

If one of the seven handles are selected:
LeftButtonPressEvent - select the appropriate handle
LeftButtonReleaseEvent - release the currently selected handle
MouseMoveEvent - move the handle
If one of the faces is selected:
LeftButtonPressEvent - select a box face
LeftButtonReleaseEvent - release the box face
MouseMoveEvent - rotate the box
In all the cases, independent of what is picked, the widget responds to the
following VTK events:
MiddleButtonPressEvent - translate the widget
MiddleButtonReleaseEvent - release the widget
RightButtonPressEvent - scale the widget's representation
RightButtonReleaseEvent - stop scaling the widget
MouseMoveEvent - scale (if right button) or move (if middle button) the widget
Event Bindings:
Note that the event bindings described above can be changed using this class's vtkWidgetEventTranslator. This class translates VTK events into the vtkBoxWidget2's widget events:

  vtkWidgetEvent::Select -- some part of the widget has been selected
vtkWidgetEvent::EndSelect -- the selection process has completed
vtkWidgetEvent::Scale -- some part of the widget has been selected
vtkWidgetEvent::EndScale -- the selection process has completed
vtkWidgetEvent::Translate -- some part of the widget has been selected
vtkWidgetEvent::EndTranslate -- the selection process has completed
vtkWidgetEvent::Move -- a request for motion has been invoked
Event Bindings:
In turn, when these widget events are processed, the vtkBoxWidget2 invokes the following VTK events on itself (which observers can listen for):

  vtkCommand::StartInteractionEvent (on vtkWidgetEvent::Select)
vtkCommand::EndInteractionEvent (on vtkWidgetEvent::EndSelect)
vtkCommand::InteractionEvent (on vtkWidgetEvent::Move)
Event Bindings:
This class, and the affiliated vtkBoxRepresentation, are second generation VTK widgets. An earlier version of this functionality was defined in the class vtkBoxWidget.
See also
vtkBoxRepresentation vtkBoxWidget
Tests:
vtkBoxWidget2 (Tests)

 #ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif
#include <iostream>
using namespace std;
#include <vtkSmartPointer.h>
// For the rendering pipeline setup:
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
// For vtkBoxWidget2:
#include <vtkBoxWidget2.h>
#include <vtkBoxRepresentation.h>
#include <vtkCommand.h>
#include <vtkTransform.h> class vtkBoxCallback:public vtkCommand
{
public:
static vtkBoxCallback*New(){return new vtkBoxCallback;}
void SetActor(vtkSmartPointer<vtkActor> actor)
{
m_actor=actor;
}
virtual void Execute(vtkObject*caller,unsigned long, void*)
{
//将调用该回调函数的调用者caller指针,转换为vtkBoxWidget2类型对象指针
vtkSmartPointer<vtkBoxWidget2> boxWidget=vtkBoxWidget2::SafeDownCast(caller);
// vtkSmartPointer<vtkBoxWidget2> boxWidget=reinterpret_cast<vtkBoxWidget2>(caller);这样转换不可以,vtkBoxWidget可以
vtkSmartPointer<vtkTransform> t=vtkSmartPointer<vtkTransform>::New();
//将boxWidget中的变换矩阵保存在t中
vtkBoxRepresentation::SafeDownCast(boxWidget->GetRepresentation())->GetTransform(t);
this->m_actor->SetUserTransform(t);
}
protected:
vtkBoxCallback(){} //构造函数
public:
vtkSmartPointer<vtkActor> m_actor;
}; int main()
{
vtkSmartPointer<vtkConeSource> coneSource=vtkSmartPointer<vtkConeSource>::New();
coneSource->SetHeight(1.5); vtkSmartPointer<vtkPolyDataMapper> mapper=vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(coneSource->GetOutputPort()); vtkSmartPointer<vtkActor> actor=vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->ResetCamera(); // Reposition camera so the whole scene is visible vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer( renderer ); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow( renderWindow ); // Use the "trackball camera" interactor style, rather than the default "joystick camera"
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor->SetInteractorStyle( style );
/**********************************设置vtkBoxWidget2及回调函数***************************************************************/
vtkSmartPointer<vtkBoxWidget2> boxWidget=vtkSmartPointer<vtkBoxWidget2>::New();
boxWidget->SetInteractor(renderWindowInteractor);
boxWidget->GetRepresentation()->SetPlaceFactor(1.1);//默认为0.5
boxWidget->GetRepresentation()->PlaceWidget(actor->GetBounds()); //为interactor配置回调函数,这样我们就能控制actor
vtkSmartPointer<vtkBoxCallback> boxCallback=vtkSmartPointer<vtkBoxCallback>::New();
boxCallback->SetActor(actor);
boxWidget->AddObserver(vtkCommand::EndInteractionEvent,boxCallback);
boxWidget->On();
renderWindowInteractor->Start();
return ;
}

vtkBoxWidget2Example的更多相关文章

随机推荐

  1. Login控件尝试

    新建web项目,添加default.aspx.Register.aspx.Login.aspx. default.aspx中添加LoginName.LoginStatus,LoginName的Form ...

  2. getopt,getoptlong学习

         getopt和getoptlong被用来解析命令行参数.   一.getopt #include <unistd.h> extern char *optarg; extern i ...

  3. js 的 protype 小总结

    这里是对该文的总结: 1.Javascript中对象的prototype属性的解释是:返回对象类型原型的引用.   2.原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并 ...

  4. 创建docker私人仓库

    关于创建docker私人仓库 1.1.           安装步骤 1.1.1.            直接从公共库上面下载register镜像在本地执行 1.1.1.1.             ...

  5. jquery $.each终止本次循环

    1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环. 2.而在jquery中 $.each则对应的使用return true 进入下一个循环,return ...

  6. 算法是什么我记不住,But i do it my way. (二)

    昨天做了一道算法题给大家分享了下我的解法,有给出建设性意见的,有支持的还有看得一知半解的.自己想了想的确有可以优化的地方,贴出优化方案.原题和解答过程在这里http://www.cnblogs.com ...

  7. 升级Ubuntu 16.04 LTS后 DSL拨号上网(ppp)连接自动断开解决办法

    原本在Ubuntu 15.10用拨号上网没有问题,但升级了16.04 LTS后发现原来的DSL连接不上了.主要表现为: 1.在NetworkManager里面选择DSL Connection能够尝试拨 ...

  8. nginx配置

    先在 cd /usr/local/nginx/conf 目录下找到 nginx.conf 文件 user www www; worker_processes 8; error_log /home/ww ...

  9. 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\106f9ae8\cc0e1

    在本地开发环境没问题,但是发布到服务器出现:未能写入输出文件"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.Ne ...

  10. CocoaPods的那些坑

    CocoaPods的那些坑 文章转自http://blog.csdn.net/zhanniuniu/article/details/52159362#comments 我跟博主的经历超级像!不过自己用 ...