スポンサーリンク

VTKのカメラ状態を保存・リストア

カメラ状態を保存リストアする。行列ではないので各ベクトルや値を個別に取り出さないといけない。

#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;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: