Я пытаюсь использовать функцию обратного вызова для запуска действия при нажатии клавиши (клавиатуры). Для этого я реализую пример «KeyPressObserver». Моя цель - увеличить радиус сферы, когда я нажимаю на стрелку «Вправо».
В коде, который я показываю, как я изменил пример, чтобы достичь своей цели.
void KeypressCallbackFunction(
vtkObject* caller,
long unsigned int eventId,
void* clientData,
void* callData);
std::string key = "";
int main(int, char* [])
{
// Create a sphere
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(5.0);
sphereSource->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
// Create an actor
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// 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);
vtkSmartPointer<vtkCallbackCommand> keypressCallback = vtkSmartPointer<vtkCallbackCommand>::New();
keypressCallback->SetCallback(KeypressCallbackFunction);
renderWindowInteractor->AddObserver(vtkCommand::KeyPressEvent, keypressCallback);
keypressCallback->SetClientData(sphereSource);
//key = renderWindowInteractor->GetKeySym();
renderer->InteractiveOn();
renderer->AddActor(actor);
renderWindowInteractor->Initialize();
renderer->SetBackground(1, 1, 1); // Background color white
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
void KeypressCallbackFunction(vtkObject* caller, long unsigned int
vtkNotUsed(eventId), void* clientData, void* callData)
{
std::cout << "Keypress callback" << std::endl;
vtkRenderWindowInteractor* iren = static_cast<vtkRenderWindowInteractor*>(caller);
std::cout << "Pressed: " << iren->GetKeySym() << std::endl;
key = iren->GetKeySym();
vtkSphereSource* sphere = static_cast<vtkSphereSource*>(clientData);
if (key == "Right") {
std::cout << "TEST RIGHT" << std::endl;
sphere->SetRadius(10);
sphere->Modified();
sphere->Update();
}
}
Проблема в том, что когда я запускаю этот код, действие, связанное с нажатием клавиши, запускается толькопосле этого я нажимаю стрелку вправо и после щелчка мышью. Я хотел бы начать действие только со стрелкой вправо, а не со вторым щелчком мыши. В чем проблема? Я не нашел ничего онлайн для решения этой проблемы, пожалуйста, помогите.