求助: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;
}

1个回答

u012865583
小影的旅途 这个我也看过了,但是没太看懂,还希望能详细的分析一下,谢谢
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问