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. request.getContextPath()报错

    别人的项目,刚用MyEclipse加载进来,一大堆错误(见怪不怪了) JSP报错,上图: 报错:“The method getContextPath() from the type HttpServl ...

  2. 禁用Windows重复数据删除

    重复数据删除,可以减少磁盘占用,但使用不当也有可能增加IO,另外,也为此功能会将硬盘分块,所以当硬盘占用较高时,进行碎片整理也比较困难,所以有时需要禁用掉重复数据删除功能,并解除重复数据的优化,可以通 ...

  3. Holographic Remoting Player

    https://developer.microsoft.com/en-us/windows/holographic/holographic_remoting_player http://www.cnb ...

  4. phpstudy配置伪静态的方法

    mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法1.检测Apache是否支持mod_rewrite通过php提供的phpinfo()函数查看环 ...

  5. C Primer Plus 学习体会

    本月刚刚开始学习<C primer plus>,之前课上草草学过一遍,讲到指针就结束了.现在重新开始看感觉难度不大只是刚开始接触有些语言细节比较琐碎.学习这一周的体会如下: 诸多前辈推荐的 ...

  6. JavaScript的two-sum问题解法

    一个很常见的问题,找出一个数组中和为给定值的两个数的下标.为了简单一般会注明解只有一个之类的. 最容易想到的方法是循环遍历,这里就不说了. 在JS中比较优雅的方式是利用JS的对象作为hash的方式: ...

  7. [LeetCode] Excel Sheet Column Number 求Excel表列序号

    Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, retur ...

  8. 从点云到网格(三)Poisson重建

    Possion重建是Kazhdan等2006年提出的网格重建方法[1].Possion重建的输入是点云及其法向量,输出是三维网格.Poisson有公开的源代码[2].PCL中也有Poisson的实现. ...

  9. [Java]使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图

    第一篇文章,就从一个简单爬虫开始吧. 这只虫子的功能很简单,抓取到”煎蛋网xxoo”网页(http://jandan.net/ooxx/page-1537),解析出其中的妹子图,保存至本地. 先放结果 ...

  10. 【C#】类单例 可以解决全局变量的问题

    单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点. 知道 详解