Ich mache einen einfacheren Viewer, um ein Mesh zu lesen und zu visualisieren.Rendern eines Gitters mit VTK api
VTK ist neu für mich und ich versuche zuerst herauszufinden, die beste/effizienteste Möglichkeit zum Einrichten der Maschendaten für den Betrachter. Ich sehe, es gibt viele Beispiele für VTK mit C++, aber viele von ihnen sind in Vtk-Format oder Rendering-Primitiven zu konvertieren.
Ich bin nicht interessiert an VTK-Format bei der Umwandlung, ich, was nur meine Netzdaten zu einem VTK unstrukturierten Gitter oder VTK Poly Daten gesetzt einzurichten und sie machen.
Ich habe einen kleinen Test gemacht. Der folgende Code wird richtig wiedergegeben, aber ist dies die effizienteste Methode zum Einrichten des Datasets? Wenn ich N_SQUARES
auf 1 000 000 setze, funktioniert es, aber die Dreiecksschleife scheint sehr langsam zu sein.
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);
Vielen Dank! Das ist die Art von Antwort, die ich brauchte. Ändere meinen Code und teste ihn aus. Ich habe einige Erfahrung mit OpenGL und die Verwendung von Puffer und so weiter zum Rendern. Ich glaube "unter die Haube" VTK nutzt dies. Gibt es einen Überblick darüber, wie VTK die verschiedenen OpenGL-Methoden aufruft? – remi000
@ remi000 Alle OpenGL-Aufrufe von VTK beschränken sich auf Klassen in den Verzeichnissen 'VTK/Rendering/OpenGL' oder' VTK/Rendering/OpenGL2' (je nachdem, ob Sie das alte oder das neue OpenGL-Backend verwenden. Im Director, dem Aufrufe von OpenGL sind auf viele Klassen verteilt, zum Beispiel 'vtkOpenGLPolyDataMapper.cxx' füllt' vtkOpenGLVertexBufferObject'-Instanzen mit Daten, Aufrufe, die die Pufferobjekte binden/hochladen, befinden sich in 'vtkOpenGLBufferObject' (die Oberklasse von' vtkOpenGLVertexBufferObject'). – Drone2537