メッシュを読み込んで視覚化するためのビューアが簡単になりました。VTK APIを使用したメッシュのレンダリング
VTKは私には新しく、私は最初に、ビューアのメッシュデータを設定するための最善の方法を見つけようとしています。私はVTKとC++の例がたくさんありますが、多くはvtk形式やレンダリングプリミティブに変換することです。
私は私かVTKポリデータがを設定し、それをレンダリングVTK非構造格子に私のメッシュデータを設定するだけで何、VTKフォーマットに変換するのに興味がありません。
私は少しテストをしました。このコードは正しくレンダリングされますが、これがデータセットを設定する最も効率的な方法ですか?私がN_SQUARES
を1 000 000に設定すると、それは機能しますが、三角ループは非常に遅いようです。
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
//TEST MESH
int N_SQUARES = 100;
//This creates node coordinates for N_SQUARES amount of squares. (Nodal data would be read from a file later on)
vtkSmartPointer<vtkPoints> nodes = vtkSmartPointer<vtkPoints>::New();
for (int i = 0; i < N_SQUARES; i++){
nodes->InsertNextPoint(0.0, 0.0, 0.0 + 0.2f*float(i));
nodes->InsertNextPoint(1.0, 0.0, 0.0 + 0.2f*float(i));
nodes->InsertNextPoint(1.0, 1.0, 0.0 + 0.2f*float(i));
nodes->InsertNextPoint(0.0, 1.0, 0.2 + 0.2f*float(i));
}
//Here two triangles are created for each square. (these indices would later on be read from FEM element data)
vtkSmartPointer<vtkCellArray> triangles = vtkSmartPointer<vtkCellArray>::New();
for (int j = 0; j < N_SQUARES; j++){
vtkSmartPointer<vtkTriangle> triangle1 = vtkSmartPointer<vtkTriangle>::New();
triangle1->GetPointIds()->SetId(0, 0 + j);
triangle1->GetPointIds()->SetId(1, 1 + j);
triangle1->GetPointIds()->SetId(2, 2 + j);
vtkSmartPointer<vtkTriangle> triangle2 = vtkSmartPointer<vtkTriangle>::New();
triangle2->GetPointIds()->SetId(0, 2 + j);
triangle2->GetPointIds()->SetId(1, 3 + j);
triangle2->GetPointIds()->SetId(2, 0 + j);
triangles->InsertNextCell(triangle1);
triangles->InsertNextCell(triangle2);
}
vtkSmartPointer<vtkPolyData> meshData = vtkSmartPointer<vtkPolyData>::New();
meshData->SetPoints(nodes);
meshData->SetPolys(triangles);
vtkSmartPointer<vtkPolyDataMapper> meshMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
meshMapper->SetInputData(meshData);
vtkSmartPointer<vtkActor> meshActor = vtkSmartPointer<vtkActor>::New();
meshActor->SetMapper(meshMapper);
renderer->AddActor(meshActor);
ui.qvtkWidget->GetRenderWindow()->AddRenderer(renderer);
ありがとうございました!これは私が必要としている答えの一種です。コードを修正してテストします。私は、OpenGLとバッファの使用など、レンダリングの経験があります。私は "ボンネットの下で" VTKがこれを使用していると信じています。 VTKがさまざまなOpenGLメソッドを呼び出す方法の概要はありますか? – remi000
@ remi000 VTKのすべてのOpenGL呼び出しは、VTK/Rendering/OpenGLまたはVTK/Rendering/OpenGL2ディレクトリのクラスに限定されています(古いOpenGLまたは新しいOpenGLバックエンドを使用するかどうかによって異なります)。 'vtkOpenGLPolyDataMapper.cxx'は' vtkOpenGLVertexBufferObject'インスタンスにデータを取り込み、バッファオブジェクトをバインド/アップロードするコールは 'vtkOpenGLBufferObject'(' vtkOpenGLVertexBufferObject'のスーパークラス)にあります。 – Drone2537