level 3
rt vtk默认情况时鼠标中键移动对象,怎么改为鼠标走遍移动对象呢?
2015年07月31日 04点07分
1
level 12
这个修改交互器就OK了~
或者自己写callback函数。
2015年07月31日 05点07分
2
可以给一个例子吗? 还有就是可以给我一份vtk的教程吗?最近在学习vtk,有很多东西都搞不懂,比如说vtkProp能不能具体的描述,Style能不能自己定义,应该怎么定义? 期待你的回答,谢谢。
2015年07月31日 05点07分
@禄冰0gx 《VTK图形图像开发进阶/张晓东,罗火灵》
![[吐舌]](/static/emoticons/u5410u820c.png)
这本书可以试试~
2015年08月01日 01点08分
谢谢谢谢
![[哈哈]](/static/emoticons/u54c8u54c8.png)
~
2015年08月01日 03点08分
level 3
自己按照例子写了一个callback函数 但是好像并没有什么用,这个函数是将鼠标左键摁下,并且移动鼠标背景颜色设为(1.0,0.0,0.0) 右键键摁下并且移动鼠标背景颜色设为(0.1,0.2,0.4); 应该是这样的吧。求大神解答@rabbitride 下面贴代码
2015年08月01日 03点08分
3
level 3
#include <vtkSphereSource.h>
#include <vtkSmartPointer.h>
#include <vtkPolyData.h>
#include <vtkSliderWidget.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkCommand.h>
#include <vtkWidgetEvent.h>
#include <vtkCallbackCommand.h>
#include <vtkWidgetEventTranslator.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSliderWidget.h>
#include <vtkSliderRepresentation2D.h>
#include <vtkProperty.h>
// The callback does the work.
// The callback keeps a pointer to the sphere whose resolution is
// controlled. After constructing the callback, the program sets the
// SphereSource of the callback to
// the object to be controlled.
class vtkSliderCallback : public vtkCommand
{
public:
static vtkSliderCallback *New()
{
return new vtkSliderCallback;
}
virtual void Execute(vtkObject *caller, unsigned long, void*)
{
vtkSliderWidget *sliderWidget =
reinterpret_cast<vtkSliderWidget*>(caller);
int value = static_cast<int>(static_cast<vtkSliderRepresentation *>(sliderWidget->GetRepresentation())->GetValue());
this->SphereSource->SetPhiResolution(value*3);
this->SphereSource->SetThetaResolution(value*3);
}
vtkSliderCallback():SphereSource(0) {}
vtkSphereSource *SphereSource;
};
class vtkMouseCallback: public vtkCommand
{
public:
static vtkMouseCallback* New()
{
return new vtkMouseCallback;
}
vtkMouseCallback(){
this->slicing = 0;
this->Interactor = 0;
//this->ren->SetBackground(0.0,0.0,0.0);
};
void setRen(vtkRenderer *ren1){
this->ren = ren1;
}
vtkRenderer *getRenderer(){
return this->ren;
}
virtual void Execute(vtkObject *, unsigned long event, void *)
{
vtkRenderer *ren1 = this->getRenderer();
if(event == vtkCommand::LeftButtonPressEvent){
this->slicing = 1;
}else if(event == vtkCommand::RightButtonReleaseEvent)
{
this->slicing = 0;
}else if(event == vtkCommand::MouseMoveEvent){
if(this->slicing)
{
ren1->SetBackground(1.0,0.0,0.0);
setRen(ren1);
}else {
ren1->SetBackground(0.1,0.2,0.4);
setRen(ren1);
}
}
}
private:
vtkRenderer *ren;
int slicing;
};
int main()
{
// A sphere
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(4.0);
sphereSource->SetPhiResolution(2);
sphereSource->SetThetaResolution(1);
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInput(sphereSource->GetOutput());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetInterpolationToFlat();
// A renderer and render window
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
// An interactor
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the actors to the scene
renderer->AddActor(actor);
// Render an image (lights and cameras are created automatically)
renderWindow->Render();
// Here we describe the representation of the widget.
vtkSmartPointer<vtkSliderRepresentation2D> sliderRep = vtkSmartPointer<vtkSliderRepresentation2D>::New();
sliderRep->SetMinimumValue(3.0);
sliderRep->SetMaximumValue(1000.0);
sliderRep->SetValue(sphereSource->GetThetaResolution());
sliderRep->SetTitleText("Sphere Resolution");
// Here we use normalized display coordinates (0,1) so that the
// slider will stay in the same proportionate location if the window
// is resized.
sliderRep->GetPoint1Coordinate()->SetCoordinateSystemToNormalizedDisplay();
sliderRep->GetPoint1Coordinate()->SetValue(.1 ,.1);
sliderRep->GetPoint2Coordinate()->SetCoordinateSystemToNormalizedDisplay();
sliderRep->GetPoint2Coordinate()->SetValue(.3, .1);
// Create the callback and pass it the sphereSource to be controlled
vtkSmartPointer<vtkSliderCallback> callback = vtkSmartPointer<vtkSliderCallback>::New();
callback->SphereSource = sphereSource;
vtkMouseCallback *call = vtkMouseCallback::New();
call->setRen(renderer);
// The widget is the controller for the interction.
vtkSmartPointer<vtkSliderWidget> sliderWidget = vtkSmartPointer<vtkSliderWidget>::New();
sliderWidget->SetInteractor(renderWindowInteractor);
sliderWidget->SetRepresentation(sliderRep);
sliderWidget->SetAnimationModeToAnimate();
sliderWidget->EnabledOn();
//renderWindowInteractor->Initialize();
renderWindow->Render();
// Observe the interaction events of the widget. If the computation
// in the callback is time consuming, observe the
// EndInteractionEvent instead.
sliderWidget->AddObserver(vtkCommand::InteractionEvent,callback);
renderer->AddObserver(vtkCommand::MouseMoveEvent,call);
renderer->AddObserver(vtkCommand::LeftButtonPressEvent,call);
renderer->AddObserver(vtkCommand::RightButtonPressEvent,call);
renderWindowInteractor->Start();
return 0;
}
2015年08月01日 03点08分
4
level 3
第一个callback是例子中自带的,通过widget改变球体的快数。第二个callback就是自己写的了
2015年08月01日 03点08分
5