スポンサーリンク

| キーワード:

vtk 9.0 で表示(3) マウスピック

マウスクリックされたオブジェクトを特定する。

参考: https://vtk.org/Wiki/VTK/Examples/Cxx/Interaction/Picking

ソースコード

//VTK_MODULE_INITに必要
#include <vtkAutoInit.h>


#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkPropPicker.h>// ピックに必要
#include <vtkPolyDataMapper.h>
#include <vtkPlaneSource.h>


#ifdef _DEBUG
#pragma comment(lib,"vtkCommonCore-9.0d.lib")
#pragma comment(lib,"vtkRenderingCore-9.0d.lib")
#pragma comment(lib,"vtkInteractionStyle-9.0d.lib")
#pragma comment(lib,"vtkFiltersSources-9.0d.lib")
#pragma comment(lib,"vtkCommonExecutionModel-9.0d.lib")
#pragma comment(lib,"vtkRenderingOpenGL2-9.0d.lib")
#else
#pragma comment(lib,"vtkCommonCore-9.0.lib")
#pragma comment(lib,"vtkRenderingCore-9.0.lib")
#pragma comment(lib,"vtkInteractionStyle-9.0.lib")
#pragma comment(lib,"vtkFiltersSources-9.0.lib")
#pragma comment(lib,"vtkCommonExecutionModel-9.0.lib")
#pragma comment(lib,"vtkRenderingOpenGL2-9.0.lib")
#endif

//必須
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);


/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////


// 参考:
// https://vtk.org/Wiki/VTK/Examples/Cxx/Interaction/Picking
// Handle mouse events
class MouseInteractorStyle2 : public vtkInteractorStyleTrackballCamera
{
public:
  static MouseInteractorStyle2* New();
  vtkTypeMacro(MouseInteractorStyle2, vtkInteractorStyleTrackballCamera);

  virtual void OnLeftButtonDown()
  {
    int* clickPos = this->GetInteractor()->GetEventPosition();

    // ピック下オブジェクトを取得
    auto picker = vtkSmartPointer<vtkPropPicker>::New();
    picker->Pick(clickPos[0], clickPos[1], 0, this->GetDefaultRenderer());

    // オブジェクトがクリックされていたら位置とアドレスを出力
    if (picker->GetActor() != nullptr) {

      double* pos = picker->GetPickPosition();
      printf("(%lf %lf %lf)[%p]\n", pos[0], pos[1], pos[2], picker->GetActor());

    }

    // Forward events
    vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
  }

private:

};
vtkStandardNewMacro(MouseInteractorStyle2);



// Execute application.
int main(int, char *[])
{
  auto planeSource = vtkSmartPointer<vtkPlaneSource>::New();
  planeSource->Update();

  // Create a polydata object
  vtkPolyData* polydata = planeSource->GetOutput();

  // Create a mapper
  auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();

  mapper->SetInputData(polydata);

  // Create an actor
  auto actor = vtkSmartPointer<vtkActor>::New();
  actor->SetMapper(mapper);

  std::cout << "Actor address: " << actor << std::endl;

  // A renderer and render window
  auto renderer = vtkSmartPointer<vtkRenderer>::New();
  auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);

  // An interactor
  auto renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  // Set the custom stype to use for interaction.
  auto style = vtkSmartPointer<MouseInteractorStyle2>::New();
  style->SetDefaultRenderer(renderer);

  renderWindowInteractor->SetInteractorStyle(style);

  // Add the actors to the scene
  renderer->AddActor(actor);
  renderer->SetBackground(0, 0, 1);

  // Render and interact
  renderWindow->Render();
  renderWindowInteractor->Initialize();
  renderWindowInteractor->Start();

  return EXIT_SUCCESS;
}

コメントを残す

メールアドレスが公開されることはありません。

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


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