スポンサーリンク

vtk 9.0 で表示(6) ライトを追加

VTKでライトを使用。問題はデフォルトのカメラの位置からのライトがどうやっても消せないことで、ひとまずRender()の後にRemoveAllLightsで全てのライトを消すことで対処している。

より大きな問題は一番最初の描画ではライトの設定が反映されていないものが描画されること。多分バッファの更新ができていないのだと思う。要検討。

参考:

https://vtk.org/Wiki/VTK/Examples/Cxx/Lighting/Light

//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 <vtkLight.h>
#include <vtkLightCollection.h>

#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")

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

vtkSmartPointer<vtkActor> create_cylinder_and_map();

vtkSmartPointer<vtkLight> mylight() {

  double lightPosition[3] = { 0, 0, 3 };

  // Create a light
  double lightFocalPoint[3] = { 0,0,0 };
  vtkSmartPointer<vtkLight> light = vtkSmartPointer<vtkLight>::New();
  light->SetLightTypeToSceneLight();
  light->SetPosition(lightPosition[0], lightPosition[1], lightPosition[2]);
  light->SetFocalPoint(lightFocalPoint[0], lightFocalPoint[1], lightFocalPoint[2]);
  light->SetDiffuseColor(1, 0, 0);
  light->SetAmbientColor(0, 1, 0);
  light->SetSpecularColor(0, 0, 1);

  //light->SetConeAngle(10);
  //light->SetPositional(true); // required for vtkLightActor below

  return light;
}
int main(int /*argc*/, char ** /*argv*/)
{

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

  //////////////////////////////////////
  vtkSmartPointer<vtkActor> cylinder_actor = create_cylinder_and_map();
  renderer->AddActor(cylinder_actor);
  //////////////////////////////////////
  vtkSmartPointer<vtkLight> light = mylight();


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

  //////////////////////////////////////
  auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();

  renderWindow->AddRenderer(renderer);
  renderWindow->SetInteractor(interactor);

  renderWindow->Render();

  // 効果がない(?)
  renderer->LightFollowCameraOff();

  vtkLightCollection* originalLights = renderer->GetLights();
  std::cout << "Originally there are " << originalLights->GetNumberOfItems() << " lights." << std::endl;
  //renderer->RemoveLight((vtkLight*)originalLights->GetItemAsObject(0));
  renderer->RemoveAllLights();// デフォルトのライトを消すために入れている

  // renderWindow->Render() の後にAddLightする
  renderer->AddLight(light);

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

  return 0;
}

vtkSmartPointer<vtkActor> create_cylinder_and_map() {
  // 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);

  return actor;

}

コメントを残す

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

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


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