背景
VTK离屏渲染情况下,没有窗口,鼠标键盘的响应是无效的,程序直接退出。
只好模拟键盘输入,通过输入字符,来模拟键盘的功能。
代码如下:
#include <vtkPolyDataMapper.h>
#include <vtkObjectFactory.h>
#include <vtkActor.h>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkSphereSource.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <unistd.h>
#include <vtkPNGWriter.h>
#include <vtkWindowToImageFilter.h>
int main(int, char *[])
{
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<KeyPressInteractorStyle> style =
vtkSmartPointer<KeyPressInteractorStyle>::New();
renderWindowInteractor->SetInteractorStyle(style);
style->SetCurrentRenderer(renderer);*/
renderer->AddActor(actor);
renderer->SetBackground(1,1,1); // Background color white
renderWindow->Render();
renderWindowInteractor->Start();
int ra = 5;
while(1)
{
std::cout<<"please input radius:\n";
int radius = 0;
std::cin >> radius;
ra = ra + radius;
sphereSource->SetRadius(ra);
sphereSource->Modified();
sphereSource->Update();
vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter =
vtkSmartPointer<vtkWindowToImageFilter>::New();
windowToImageFilter->SetInput(renderWindow);
windowToImageFilter->Update();
vtkSmartPointer<vtkPNGWriter> writer =
vtkSmartPointer<vtkPNGWriter>::New();
std::string ss = std::to_string((long long)ra) + ".png";
writer->SetFileName(ss.c_str());
writer->SetInputConnection(windowToImageFilter->GetOutputPort());
writer->Write();
sleep(1);
}
return EXIT_SUCCESS;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
PROJECT(KeypressEvents)
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
add_executable(KeypressEvents MACOSX_BUNDLE KeypressEvents.cxx)
if(VTK_LIBRARIES)
target_link_libraries(KeypressEvents ${VTK_LIBRARIES})
else()
target_link_libraries(KeypressEvents vtkHybrid vtkWidgets)
endif()
编译:
rm -rf build && mkdir build && cd build && cmake -DVTK_DIR=/app/vtk/build .. && make -j8
结果:
root@ubuntu:# ./KeypressEvents
please input radius:
1
please input radius:
1
please input radius:
1
please input radius:
1
please input radius: