ぬの部屋(仮)
nu-no-he-ya
  •    1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
    1234567
    891011121314
    15161718192021
    22232425262728
           
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
         12
    3456789
    10111213141516
    17181920212223
    242526272829 
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
        123
    45678910
    11121314151617
    18192021222324
    25262728   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    15161718192021
    293031    
           
         12
    3456789
    10111213141516
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728     
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
          1
    2345678
    9101112131415
    16171819202122
    232425262728 
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
  • 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;
    
    }
    

    vtk 9.0 で表示(5) ポリゴンの頂点色を付けて表示

    //VTK_MODULE_INITに必要
    #include <vtkAutoInit.h>
    
    
    #include <vtkSmartPointer.h>
    #include <vtkRenderer.h>
    #include <vtkRenderWindow.h>
    #include <vtkRenderWindowInteractor.h>
    
    #include <vtkPoints.h> // vtkPoints用
    #include <vtkPolygon.h> // vtkPolygon用
    #include <vtkPolyData.h> //vtkPolyData用
    #include <vtkPolyDataMapper.h>
    
    #include <vtkUnsignedCharArray.h> //色データ用
    #include <vtkPointData.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,"vtkCommonDataModel-9.0.lib ") // ポリゴン用
    
    #pragma comment(lib,"vtkRenderingOpenGL2-9.0.lib")
    
    
    //必須
    VTK_MODULE_INIT(vtkRenderingOpenGL2);
    VTK_MODULE_INIT(vtkInteractionStyle);
    
    
    int main(int /*argc*/, char ** /*argv*/)
    {
    
    
      //////////////////////////////////////
      vtkSmartPointer < vtkPoints > points = vtkSmartPointer < vtkPoints >::New();
      points->InsertNextPoint(0.0, 0.0, 0.0);
      points->InsertNextPoint(1.0, 0.0, 0.0);
      points->InsertNextPoint(1.0, 1.0, 0.0);
      points->InsertNextPoint(0.0, 0.4, 0.0);
    
    
      //////////////////////////////////////
      vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
      polygon->GetPointIds()->SetNumberOfIds(4);//4頂点
      polygon->GetPointIds()->SetId(0, 0);
      polygon->GetPointIds()->SetId(1, 1);
      polygon->GetPointIds()->SetId(2, 2);
      polygon->GetPointIds()->SetId(3, 3);
    
    
    
    
      //////////////////////////////////////
      vtkSmartPointer<vtkCellArray> polylist = vtkSmartPointer<vtkCellArray>::New();
      polylist->InsertNextCell(polygon);
    
      //////////////////////////////////////
      vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
      polydata->SetPoints(points);
      polydata->SetPolys(polylist);
    
    
      ////////////////////////////////////////////
      ////////////////////////////////////////////
      vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
      colors->SetNumberOfComponents(3);
      colors->SetName("Colors");
    
      colors->InsertNextTuple3(255, 0, 0);
      colors->InsertNextTuple3(0, 255, 0);
      colors->InsertNextTuple3(0, 0, 255);
      colors->InsertNextTuple3(255, 255, 0);
    
      polydata->GetPointData()->SetScalars(colors);
    
      ////////////////////////////////////////////
      ////////////////////////////////////////////
    
    
    
    
      //////////////////////////////////////
      // Create a mapper and actor
      vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
      mapper->SetInputData(polydata);
      vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
      actor->SetMapper(mapper);
    
      //////////////////////////////////////
      auto renderer = vtkSmartPointer<vtkRenderer>::New();
      renderer->AddActor(actor);
      renderer->ResetCamera();
    
      //////////////////////////////////////
      auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
      //////////////////////////////////////
      auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
      renderWindow->AddRenderer(renderer);
      renderWindow->SetInteractor(interactor);
      renderWindow->Render();
    
      interactor->Start(); //イベントループへ入る
    
      return 0;
    }
    

    vtk 9.0 で表示(4) ポリゴンを表示

    //VTK_MODULE_INITに必要
    #include <vtkAutoInit.h>
    
    
    #include <vtkSmartPointer.h>
    #include <vtkRenderer.h>
    #include <vtkRenderWindow.h>
    #include <vtkRenderWindowInteractor.h>
    
    #include <vtkPoints.h> // vtkPoints用
    #include <vtkPolygon.h> // vtkPolygon用
    #include <vtkPolyData.h> //vtkPolyData用
    #include <vtkPolyDataMapper.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,"vtkCommonDataModel-9.0.lib ") // ポリゴン用
    
    //必須
    #pragma comment(lib,"vtkRenderingOpenGL2-9.0.lib")
    
    //必須
    VTK_MODULE_INIT(vtkRenderingOpenGL2);
    VTK_MODULE_INIT(vtkInteractionStyle);
    
    
    int main(int /*argc*/, char ** /*argv*/)
    {
    
    
      //////////////////////////////////////
      vtkSmartPointer < vtkPoints > points = vtkSmartPointer < vtkPoints >::New();
      points->InsertNextPoint(0.0, 0.0, 0.0);
      points->InsertNextPoint(1.0, 0.0, 0.0);
      points->InsertNextPoint(1.0, 1.0, 0.0);
      points->InsertNextPoint(0.0, 0.4, 0.0);
    
    
      //////////////////////////////////////
      vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
      polygon->GetPointIds()->SetNumberOfIds(4);//4頂点
      polygon->GetPointIds()->SetId(0, 0);
      polygon->GetPointIds()->SetId(1, 1);
      polygon->GetPointIds()->SetId(2, 2);
      polygon->GetPointIds()->SetId(3, 3);
    
      //////////////////////////////////////
      vtkSmartPointer<vtkCellArray> polylist = vtkSmartPointer<vtkCellArray>::New();
      polylist->InsertNextCell(polygon);
    
      //////////////////////////////////////
      vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
      polydata->SetPoints(points);
      polydata->SetPolys(polylist);
    
    
    
      //////////////////////////////////////
      // Create a mapper and actor
      vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
      //mapper->SetInputConnection(cylinderSource->GetOutputPort());
      mapper->SetInputData(polydata);
      vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
      actor->SetMapper(mapper);
    
      //////////////////////////////////////
      auto renderer = vtkSmartPointer<vtkRenderer>::New();
      renderer->AddActor(actor);
      renderer->ResetCamera();
    
      //////////////////////////////////////
      auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
      //vtkInteractorStyleTrackballCamera
      //////////////////////////////////////
      auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
      renderWindow->AddRenderer(renderer);
      renderWindow->SetInteractor(interactor);
      renderWindow->Render();
    
      interactor->Start(); //イベントループへ入る
    
      return 0;
    }
    

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

    vtk 9.0 で表示(2) Cylinder表示

    //VTK_MODULE_INITに必要
    #include <vtkAutoInit.h>
    
    
    #include <vtkSmartPointer.h>
    #include <vtkRenderer.h>
    #include <vtkRenderWindow.h>
    #include <vtkRenderWindowInteractor.h>
    
    //円筒とその表示に必要
    #include <vtkCylinderSource.h>
    #include <vtkPolyDataMapper.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);
    
    
    int main(int /*argc*/, char ** /*argv*/)
    {
    
    
      //////////////////////////////////////
      // 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);
    
      //////////////////////////////////////
      auto renderer = vtkSmartPointer<vtkRenderer>::New();
      renderer->AddActor(actor);
      renderer->ResetCamera();
    
      //////////////////////////////////////
      auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    
      //////////////////////////////////////
      auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
      renderWindow->AddRenderer(renderer);
      renderWindow->SetInteractor(interactor);
      renderWindow->Render();
    
      interactor->Start(); //イベントループへ入る
    
      return 0;
    }
    

    VTKをCMakeしたらUnknown CMake command “vtkm_declare_headers”

    投稿順を間違えた。なお、以下のディレクトリ設定さえ間違えなければwarning一つでないほど綺麗にCMakeできる。

    VTKをCMakeしようとして失敗

    VTK-9.0.1をCMakeしようとしたら以下のようなエラーが出た。

    CMake Error at CMakeLists.txt:24 (vtkm_declare_headers):
    Unknown CMake command “vtkm_declare_headers”.

    原因は以下のディレクトリをWhere is the source codeに指定したことによる。

    解凍したフォルダの一番上の階層にあるCMakeListではなく、その一つ下のVTK-9.0.1ディレクトリを指定しなければならない。

    vtk 9.0 で表示(1) Hello World

    // VTK_MODULE_INITに必要
    #include <vtkAutoInit.h>
    
    
    #include <vtkSmartPointer.h>
    #include <vtkTextActor.h>
    #include <vtkRenderer.h>
    #include <vtkRenderWindow.h>
    #include <vtkRenderWindowInteractor.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")
    #pragma comment(lib,"vtkRenderingFreeType-9.0.lib")
    
    VTK_MODULE_INIT(vtkRenderingOpenGL2);
    VTK_MODULE_INIT(vtkRenderingFreeType);
    VTK_MODULE_INIT(vtkInteractionStyle);
    
    
    int main(int /*argc*/, char ** /*argv*/)
    {
      auto textActor = vtkSmartPointer<vtkTextActor>::New();
      textActor->SetInput("Hello World");
    
      auto renderer = vtkSmartPointer<vtkRenderer>::New();
      renderer->AddActor(textActor);
      renderer->ResetCamera();
    
      auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    
      auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
      renderWindow->AddRenderer(renderer);
      renderWindow->SetInteractor(interactor);
      renderWindow->Render();
      interactor->Start();
    
      return 0;
    }
    

    PythonでOpen3dを使う(PointCloud作成)。あとPythonの配列もちょっと。

    PointCloudのサンプルは沢山あるのだがランダム頂点を表示するような物ばかりで、任意の頂点を追加する方法がわからず一月近く調べていた。Pythonは普段使わないのでそういうことになったのだが以下がとりあえずの答。

    import open3d
    import numpy
    
    # 点群型データ作成
    pcd = open3d.geometry.PointCloud()
    
    # 座標設定
    pcd.points.append([0.0,0.0,0.0])
    pcd.points.append([1.0,1.0,1.0])
    pcd.points.append([1.0,2.0,0.0])
    
    # 色設定
    pcd.colors.append([1.0,0.0,0.0]);
    pcd.colors.append([0.0,1.0,0.0]);
    pcd.colors.append([0.0,0.0,1.0]);
    
    # 法線設定
    pcd.normals.append([1.0,0.0,0.0]);
    pcd.normals.append([0.0,1.0,0.0]);
    pcd.normals.append([0.0,0.0,1.0]);
    
    open3d.visualization.draw_geometries(
      [pcd],
      width=400,
      height=400,
      point_show_normal = True
      )
    

    調べた手順

    一応、私のように必要に迫られてPythonやってる人のためにどうやって調べたかを書いておくと、以下のプログラムを書いて走らせる。

    import open3d
    
    pcd = open3d.io.read_point_cloud("bun000.ply")
    print( type ( pcd.points ) )
    print( type ( pcd.points[0] ) )
    

    すると以下のような結果を得られる。

    <class 'open3d.cpu.pybind.utility.Vector3dVector'>
    <class 'numpy.ndarray'>

    これでどうやらVector3dVectorという型が頂点リストになっているらしいので以下を検索する。

    http://www.open3d.org/docs/release/python_api/open3d.utility.Vector3dVector.html

    append(self: open3d.cpu.pybind.utility.Vector3dVector, x: numpy.ndarray[float64[3, 1]])

    するとappendぽい関数がある。この読み方、

    引数名:データ型 , 引き数名:データ型 , …

    となっているらしい。で、pythonのselfはC++におけるthisなので無視して、与えるのがxでその型がnumpy.ndarrayだと言うのでndarrayについて調べる。

    受け手側がndarrayなので、ndarrayには普通の配列[x,y,z]などをそのまま入れられるらしい?ので、最初のコードになる。

    AnacondaでPythonを使う(目的 Open3d)

    前置き

    普段はC++からOpen3d使っているのだがひょんなことからPythonから使わざるを得なくなった。色々詰まったので流れをメモしておきたい。

    なおAnacondaを使う。初めて使うので設定からやる。Anacondaは開発環境を切り替えて使うためのソフトである。つまり、

    ・このスクリプトはnumpy 0.5+open3d 0.3以外では動かない。

    ・別のはnumpy 1.19+open3d 1.12以外では動かない。

    ・でもどちらも頻繁に使う

    みたいな状況で簡単に環境を切り替えるのに便利だという事(らしい)。

    環境

    Windows 10

    Anaconda

    インストール

    https://www.anaconda.com/products/individualから、一番下の方にある「Anaconda Installers」の64-Bit Graphical Installer (457 MB)あたりをクリックしてダウンロード・インストールする

    参考:https://www.python.jp/install/anaconda/windows/install.html

    仮想環境構築

    まず仮想環境を作り、その環境に必要なライブラリをインストールする。

    AnacondaをインストールするとAnaconda PowerShell Prompt(Anaconda 3)というのがスタートメニューに追加されるので起動する。

    あるいはAnaconda Promptの方でもいい。lsとかが使えなくてやや面倒だが、activateを何もしなくても使えるメリットがある。

    1.環境作成

    conda create -n 環境名
    

    例(環境名devo3dを作成):

    conda create -n devo3d
    

    環境が作成できたか確認:

    conda info -e
    

    作成した環境(devo3d)へ移行:

    Anaconda Promptを使っているなら以下のactivateで環境を移行できるが、PowerShellを使っている場合はactivateがそのままでは動かないのでもう一手間必要になる

    activate devo3d
    

    ※PowerShellを使っている場合はactivateの前に以下を実行。ただし何をやっているのか著者は理解していないのでちゃんと調べてからやった方が良い。

    conda install -n root -c pscondaenvs pscondaenvs

    参考:

    https://qiita.com/nabehide/items/097553ccd51543ee31fb

    2.Open3d インストール

    open3dのPythonモジュールをインストールする。

    conda install -c open3d-admin open3d

    参考:http://www.open3d.org/docs/release/getting_started.html

    3.バージョン確認

    インストールされたバージョンによってはサンプルが全く動かないので、バージョンを確認する。pip list で-oオプションを付けると、バージョンアップの必要なライブラリの一覧だけを見られる。

    pip list -o

    明らかにバージョンが低い場合はアップデートする

    pip install -U open3d

    参考:https://qiita.com/HyunwookPark/items/242a8ceea656416b6da8

    4.稼働確認

    importだけ実行してみてエラーが出なければ(無言なら)成功している。

    python -c "import open3d"

    別ファイルのBlender Pythonスクリプトをimportして使い回す

    一つのファイルに全ての関数やクラスを入れてしまうとあまりに見通しが悪くなるのでファイルを分けたい。

    自分のスクリプトを入れるディレクトリの設定

    Edit → Preference → File Paths → Data → Scripts にディレクトリを設定する。注意点はディレクトリ名が\modules , \addons … でなければいけない。

    ここではimportしたいので、\modulesディレクトリを作り、そのディレクトリの親ディレクトリを指定する。

    \modules\  ディレクトリの中のファイル名(拡張子除)がモジュール名になり、これをimportすれば中の関数を呼び出すことができる。

    外部にモジュールを置き、blenderスクリプトから呼び出す

    import test
    
    test.call()
    

    更新できるようにする(メインのファイル)

    このままだと、上記test.pyを更新する度にBlenderを再起動しなければならない。実行する度に再読み込みを行うには再読み込み命令をスクリプトに書く必要がある。importlib.reload( モジュール名 )を呼び出す。

    import test
    
    #############################
    ## リロード
    import importlib
    importlib.reload(test) #モジュール名を指定
    ##
    #############################
    
    test.call()
    

    更新できるようにする(関連するファイル)

    上記test.pyがさらに内部で別のモジュールをimportしていた場合、それらは更新されない。これを更新するためには、testモジュール内部で使用する外部モジュールをimportlib.reloadする必要がある。

    modules/test.py

    import neighbour # 別ファイル neighbour.py
    import importlib # reload用
    
    # blenderから呼ばれる
    def call():
    
      importlib.reload(neighbour) # neighbour.pyの再ロード
      neighbour.hello()
    

    modules/neighbour.py

    def hello():
      print("neighbour.py is updated")