スポンサーリンク

vtkAssemblyでvtkActorをまとめる

vtkAssemblyで、二つ以上のvtkActorを纏めることができる。

#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 <vtkActor.h>
#include <vtkCubeSource.h>
#include <vtkProperty.h>

#include <vtkAssembly.h>
#include <vtkTransform.h>

#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"psapi.lib")
#pragma comment(lib,"dbghelp.lib")
#pragma comment(lib,"ws2_32.lib")


// コールバック関数を使用するのに必要
#include <vtkCallbackCommand.h>



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


///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
// コールバック関数に渡すデータ
struct MyData
{
  vtkSmartPointer<vtkAssembly> assembly;
};

// タイマーのコールバック関数
void MyTimerCallbackFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData)
{
  MyData* data = static_cast<MyData*>(clientData);

  static int angle = 0;

  vtkSmartPointer<vtkTransform> tra = vtkSmartPointer<vtkTransform>::New();
  tra->RotateWXYZ(angle+=10, 0, 0, 1);
  tra->Update();

  data->assembly->SetUserTransform(tra);

  // 画面更新
  auto interactor = static_cast<vtkRenderWindowInteractor*>(caller);
  interactor->Render();
}
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////


vtkSmartPointer<vtkActor> createActor1();
vtkSmartPointer<vtkActor> createActor2();



int main(int /*argc*/, char** /*argv*/)
{
  // アクタを作成
  vtkSmartPointer<vtkActor> actor1 = createActor1();
  vtkSmartPointer<vtkActor> actor2 = createActor2();

  // アクタをまとめてアセンブリを作成
  vtkSmartPointer<vtkAssembly> assembly = vtkSmartPointer<vtkAssembly>::New();
  assembly->AddPart(actor1);
  assembly->AddPart(actor2);

  //////////////////////////////////////
  auto renderer = vtkSmartPointer<vtkRenderer>::New();
  renderer->ResetCamera();

  // アセンブリをレンダラに追加
  renderer->AddActor(assembly);


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

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

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

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

  // タイマーに渡す構造体の作成
  MyData callbackData{ assembly };

  // タイマー作成
  auto timerCallback = vtkSmartPointer<vtkCallbackCommand>::New();
  timerCallback->SetCallback(MyTimerCallbackFunction); // コールバック関数を設定
  timerCallback->SetClientData(&callbackData); // コールバック関数に渡すデータを設定

  interactor->AddObserver(vtkCommand::TimerEvent, timerCallback); // タイマーイベントにコールバック関数を設定

  interactor->Initialize();
  interactor->CreateRepeatingTimer(100); // 100msごとにタイマーイベントを発生させる

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

  interactor->Start(); //イベントループへ入る

  return 0;
}


vtkSmartPointer<vtkActor> createActor1()
{
  // 1つ目の立方体を作成
  vtkSmartPointer<vtkCubeSource> cubeSource1 = vtkSmartPointer<vtkCubeSource>::New();
  vtkSmartPointer<vtkPolyDataMapper> mapper1 = vtkSmartPointer<vtkPolyDataMapper>::New();
  mapper1->SetInputConnection(cubeSource1->GetOutputPort());
  vtkSmartPointer<vtkActor> actor1 = vtkSmartPointer<vtkActor>::New();
  actor1->SetMapper(mapper1);
  actor1->GetProperty()->SetColor(1, 0, 0); // 赤色

  return actor1;
}
vtkSmartPointer<vtkActor> createActor2()
{
  // 2つ目の立方体を作成
  vtkSmartPointer<vtkCubeSource> cubeSource2 = vtkSmartPointer<vtkCubeSource>::New();
  cubeSource2->SetCenter(1.2, 0, 0); // 位置を変更
  vtkSmartPointer<vtkPolyDataMapper> mapper2 = vtkSmartPointer<vtkPolyDataMapper>::New();
  mapper2->SetInputConnection(cubeSource2->GetOutputPort());
  vtkSmartPointer<vtkActor> actor2 = vtkSmartPointer<vtkActor>::New();
  actor2->SetMapper(mapper2);
  actor2->GetProperty()->SetColor(0, 1, 0); // 緑色

  return actor2;
}

実行例

二つのオブジェクトにまとめて行列を適用している。

コメントを残す

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

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


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