问题描述
- 求助:vtk callback并没有完成预期的效果
-
我按照官网的例子自己写了一个callback函数,设定为初始的renderer背景颜色为黑色,点击鼠标右键后renderer的背景颜色设置为(1.0,0.0,0.0)
但是这段代码跑起来 renderer的背景颜色就是红色(1.0,0.0,0.0)。代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include// 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(static_cast(sliderWidget->GetRepresentation())->GetValue());
this->SphereSource->SetPhiResolution(value/2);
this->SphereSource->SetThetaResolution(value);
}
vtkSliderCallback():SphereSource(0) {}
vtkSphereSource *SphereSource;
};class vtkMouseCallback: public vtkCommand
{
public:
int slicing;
static vtkMouseCallback* New()
{
return new vtkMouseCallback;
}virtual void Execute(vtkObject *caller, unsigned long event, void *)
{
slicing = 0;
vtkRenderer *ren1 = vtkRenderer::SafeDownCast(caller);
if(vtkCommand::RightButtonPressEvent){
slicing = 1;
}
if(slicing){
ren1->SetBackground(1.0,0.0,0.0);
}
}};
int main()
{
// A sphere
vtkSmartPointer sphereSource = vtkSmartPointer::New();
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(4.0);
sphereSource->SetPhiResolution(2);
sphereSource->SetThetaResolution(1);vtkSmartPointer mapper = vtkSmartPointer::New();
mapper->SetInput(sphereSource->GetOutput());vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetInterpolationToFlat();// A renderer and render window
vtkSmartPointer renderer = vtkSmartPointer::New();
vtkSmartPointer renderWindow = vtkSmartPointer::New();
renderWindow->AddRenderer(renderer);// An interactor
vtkSmartPointer renderWindowInteractor = vtkSmartPointer::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 sliderRep = vtkSmartPointer::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 callback = vtkSmartPointer::New();
callback->SphereSource = sphereSource;vtkSmartPointer call = vtkMouseCallback::New();
renderWindowInteractor->AddObserver(vtkCommand::InteractionEvent,call);
// The widget is the controller for the interction.
vtkSmartPointer sliderWidget = vtkSmartPointer::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);renderWindowInteractor->Start();
return 0;
}
解决方案
http://tieba.baidu.com/p/3171604615