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