カメラ状態を保存リストアする。行列ではないので各ベクトルや値を個別に取り出さないといけない。
#include <iostream> //VTK_MODULE_INITに必要 #include <vtkAutoInit.h> #include <vtkSmartPointer.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> //円筒とその表示に必要 #include <vtkCylinderSource.h> #include <vtkPolyDataMapper.h> #include <vtkCamera.h> #include <vtkCommand.h> #include <vtkRendererCollection.h> #pragma comment(lib,"opengl32.lib") #pragma comment(lib,"psapi.lib") #pragma comment(lib,"dbghelp.lib") #pragma comment(lib,"ws2_32.lib") //必須 VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle);
struct CameraState { double Position[3]; double FocalPoint[3]; double ViewUp[3]; double ClippingRange[2]; double ViewAngle; };
// カメラの状態を保存する関数 CameraState GetCameraState(vtkCamera* camera) { CameraState state; camera->GetPosition(state.Position); camera->GetFocalPoint(state.FocalPoint); camera->GetViewUp(state.ViewUp); camera->GetClippingRange(state.ClippingRange); state.ViewAngle = camera->GetViewAngle(); return state; }
// カメラの状態を復元する関数 void LoadCameraState(vtkCamera* camera, const CameraState& state) { camera->SetPosition(state.Position); camera->SetFocalPoint(state.FocalPoint); camera->SetViewUp(state.ViewUp); camera->SetClippingRange(state.ClippingRange); camera->SetViewAngle(state.ViewAngle); }
// キーボード入力を処理 class MyCommand : public vtkCommand { CameraState camera_state; public: static MyCommand* New() { return new MyCommand; } void SetMapper(vtkSmartPointer<vtkPolyDataMapper> mapper) { this->Mapper = mapper; } void Execute(vtkObject* caller, unsigned long eventId, void*) override { if (eventId == vtkCommand::KeyPressEvent) { vtkRenderWindowInteractor* interactor = dynamic_cast<vtkRenderWindowInteractor*>(caller); std::string key = interactor->GetKeySym(); // 注意 デフォルト機能で E キーで終了してしまう // キー入力を取得 if (key == "s") {
// カメラの状態を保存 vtkRenderer* renderer = interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer(); vtkCamera* camera = renderer->GetActiveCamera(); // cameraをcamera_stateに保存 camera_state = GetCameraState(camera);
} else if (key == "r") {
// カメラの状態を復元 vtkRenderer* renderer = interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer(); vtkCamera* camera = renderer->GetActiveCamera(); // camera_stateをcameraに復元 LoadCameraState(camera, camera_state);
} interactor->GetRenderWindow()->Render(); } } private: vtkSmartPointer<vtkPolyDataMapper> Mapper; }; int main(int /*argc*/, char** /*argv*/) { ////////////////////////////////////// // Create a vtkCylinderSource vtkSmartPointer<vtkCylinderSource> cylinderSource = vtkSmartPointer<vtkCylinderSource>::New(); cylinderSource->SetCenter(0.0, 0.0, 0.0); cylinderSource->SetRadius(5.0); cylinderSource->SetHeight(7.0); cylinderSource->SetResolution(100); ////////////////////////////////////// // Create a mapper and actor vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cylinderSource->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); ////////////////////////////////////// auto renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); renderer->ResetCamera(); ////////////////////////////////////// auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); // キー入力で色を切り替えるコマンドを設定 vtkSmartPointer<MyCommand> MyKeyboardAction = vtkSmartPointer<MyCommand>::New(); MyKeyboardAction->SetMapper(mapper); interactor->AddObserver(vtkCommand::KeyPressEvent, MyKeyboardAction); ////////////////////////////////////// auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); renderWindow->SetInteractor(interactor); renderWindow->Render(); interactor->Start(); //イベントループへ入る return 0; }