スポンサーリンク

VTKでレイヤーを使用

VTKはvtkRendererをレイヤーとして複数登録できる。描画順が決まっているので、手前のレイヤーのオブジェクトは必ず手前に表示される。

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

#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

//円筒とその表示に必要
#include <vtkCylinderSource.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.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);


int main(int /*argc*/, char** /*argv*/)
{

  //////////////////////////////////////
  auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();

  //////////////////////////////////////
  auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->SetInteractor(interactor);
  renderWindow->Render();

  //////////////////////////////////////
  //////////////////////////////////////
  
  auto renderer_1st = vtkSmartPointer<vtkRenderer>::New();
  auto renderer_2nd = vtkSmartPointer<vtkRenderer>::New();

  // レイヤー番号の指定
  // 番号が若いほど背面に描画される
  renderer_1st->SetLayer(0);
  renderer_2nd->SetLayer(1);

  renderWindow->SetNumberOfLayers(2);// レイヤー数を指定しておいたほうが行儀がいいらしい
  renderWindow->AddRenderer(renderer_1st);
  renderWindow->AddRenderer(renderer_2nd);

  renderer_1st->ResetCamera();
  // カメラの共有
  renderer_2nd->SetActiveCamera(renderer_1st->GetActiveCamera());
  
  //////////////////////////////////////
  //////////////////////////////////////

  //////////////////////////////////////
  // レイヤー1にCylinderを表示
  {
    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);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(cylinderSource->GetOutputPort());
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(1.0, 0.0, 0.0);

    // レイヤー1にアクタを追加
    renderer_1st->AddActor(actor);
  }
  
  
//////////////////////////////////////
  // レイヤー2にConeを表示
  {
    vtkSmartPointer<vtkConeSource> coneSource = vtkSmartPointer<vtkConeSource>::New();
    coneSource->SetCenter(0.0, 0.0, 0.0);
    coneSource->SetRadius(5.0);
    coneSource->SetHeight(7.0);
    coneSource->SetResolution(100);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(coneSource->GetOutputPort());
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(0.0, 1.0, 0.0);

    // レイヤー2にアクタを追加
    renderer_2nd->AddActor(actor);
  }
  interactor->Start();

  return 0;
}

コメントを残す

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

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


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