スポンサーリンク

VTKでテスト用の簡単な曲面を描画

#include <iostream>

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


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

#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkPolyData.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>

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

#include <vtkCellArray.h>
#include <vtkTriangle.h>


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


vtkSmartPointer<vtkPolyData> CreateMeshData(bool cloudonly,int xcount, int ycount,float width,float height,float depth,float density) {
  vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
  vtkSmartPointer<vtkCellArray> triangles = vtkSmartPointer<vtkCellArray>::New();
  vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();

  // 頂点の登録
  for (int i = 0; i < xcount; ++i) {
    for (int j = 0; j < ycount; ++j) {
      double x = -0.5 + 1.0 * i / (xcount - 1);
      double y = -0.5 + 1.0 * j / (ycount - 1);
      double z = sin(x * density)*depth + sin(y * density) * depth;
      vtkIdType pid = points->InsertNextPoint(x*width, y*height, z);

      if (cloudonly == true)
      {
        vertices->InsertNextCell(1, &pid);
      }

    }
  }
  
  if (cloudonly == true)
  {
    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    polyData->SetVerts(vertices);
    return polyData;
  }

  // メッシュ(三角形)の作成
  for (int i = 0; i < xcount - 1; ++i) {
    for (int j = 0; j < ycount - 1; ++j) {
      // 四角形を2つの三角形に分割
      vtkIdType p1 = i * ycount + j;       // 左下
      vtkIdType p2 = (i + 1) * ycount + j; // 右下
      vtkIdType p3 = i * ycount + (j + 1); // 左上
      vtkIdType p4 = (i + 1) * ycount + (j + 1); // 右上

      // 三角形1 (p1, p2, p3)
      vtkSmartPointer<vtkTriangle> triangle1 = vtkSmartPointer<vtkTriangle>::New();
      triangle1->GetPointIds()->SetId(0, p1);
      triangle1->GetPointIds()->SetId(1, p2);
      triangle1->GetPointIds()->SetId(2, p3);
      triangles->InsertNextCell(triangle1);

      // 三角形2 (p2, p4, p3)
      vtkSmartPointer<vtkTriangle> triangle2 = vtkSmartPointer<vtkTriangle>::New();
      triangle2->GetPointIds()->SetId(0, p2);
      triangle2->GetPointIds()->SetId(1, p4);
      triangle2->GetPointIds()->SetId(2, p3);
      triangles->InsertNextCell(triangle2);
    }
  }

  // vtkPolyData の作成
  vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
  polyData->SetPoints(points);
  polyData->SetPolys(triangles);  // 三角形セルを設定

  return polyData;
}

int main(int /*argc*/, char** /*argv*/)
{
  vtkSmartPointer<vtkPolyData> polyData = CreateMeshData(false,500, 500,2,2,0.1,10);

  vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
  vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  mapper->SetInputData(polyData);
  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;
}

コメントを残す

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

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


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