working on rendering bg image; rudimentary version complete

This commit is contained in:
Djairo Hougee 2024-04-24 23:53:35 +02:00
parent 985fd6b9ed
commit 57815c64ac
2 changed files with 86 additions and 17 deletions

View File

@ -9,6 +9,10 @@ find_package(VTK COMPONENTS
CommonCore
CommonDataModel
FiltersGeneral
FiltersGeometry
FiltersProgrammable
IOImage
ImagingSources
InteractionStyle
RenderingContextOpenGL2
RenderingCore
@ -16,7 +20,6 @@ find_package(VTK COMPONENTS
RenderingGL2PSOpenGL2
RenderingOpenGL2
CommonColor
FiltersGeometry
RenderingCore)
if (NOT VTK_FOUND)

View File

@ -3,11 +3,18 @@
#include <vtkCamera.h>
#include <vtkDoubleArray.h>
#include <vtkMapper2D.h>
#include <vtkImageReader2.h>
#include <vtkImageData.h>
#include <vtkImageActor.h>
#include <vtkImageReader2Factory.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyDataMapper2D.h>
#include <vtkProgrammableGlyphFilter.h>
#include <vtkSmartPointer.h>
#include <vtkProperty.h>
#include <vtkProperty2D.h>
#include <vtkRectilinearGrid.h>
#include <vtkRectilinearGridGeometryFilter.h>
#include <vtkRenderWindow.h>
@ -15,6 +22,7 @@
#include <vtkRenderer.h>
#include <netcdf>
#include <vtkVertexGlyphFilter.h>
#define NLATS 67
#define NLONS 116
@ -46,49 +54,107 @@ tuple<vector<int>, vector<double>, vector<double>> readGrid() {
return {time, latitude, longitude};
}
int main() {
vtkNew<vtkNamedColors> colors;
void renderCoordinates(vtkRenderer *ren, vtkNamedColors *colors) {
vtkNew<vtkDoubleArray> pCoords;
pCoords->SetNumberOfComponents(3);
pCoords->SetNumberOfTuples(NLATS*NLONS);
vtkNew<vtkPoints> points;
auto [times, lats, lons] = readGrid();
double i = 0;
for (double lat : lats) {
for (double lon : lons) {
pCoords->InsertTuple3(i++, 0, lat, lon);
cout << "lat: " << (lat*1000-46125)*661/16500 << "\t lon: " << (lon*1000+15875)*661/28750 << endl;
points->InsertNextPoint((lat*1000-46125)*661/16500, (lon*1000+15875)*661/28750, 0);
}
}
vtkNew<vtkPoints> points;
points->SetData(pCoords);
vtkNew<vtkPolyData> polydata;
polydata->SetPoints(points);
vtkNew<vtkVertexGlyphFilter> glyphFilter;
glyphFilter->SetInputData(polydata);
glyphFilter->Update();
vtkNew<vtkPolyDataMapper2D> mapper;
mapper->SetInputData(polydata);
mapper->SetScalarRange(0, 40);
mapper->SetInputConnection(glyphFilter->GetOutputPort());
mapper->Update();
vtkNew<vtkActor2D> actor;
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(colors->GetColor3d("Gold").GetData());
actor->GetProperty()->SetPointSize(3);
vtkNew<vtkRenderer> ren;
ren->AddActor(actor);
ren->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());
}
void renderBackground(vtkRenderer *background) {
vtkSmartPointer<vtkImageData> imageData;
vtkNew<vtkImageReader2Factory> readerFactory;
vtkSmartPointer<vtkImageReader2> imageReader;
imageReader.TakeReference(readerFactory->CreateImageReader2("../../../../data/map_661-661.png"));
imageReader->SetFileName("../../../../data/map_661-661.png");
imageReader->Update();
imageData = imageReader->GetOutput();
vtkNew<vtkImageActor> imageActor;
imageActor->SetInputData(imageData);
background->AddActor(imageActor);
// camera stuff
// essentially sets the camera to the middle of the background, and points it at the background
double origin[3], spacing[3];
int extent[6];
imageData->GetOrigin(origin);
imageData->GetSpacing(spacing);
imageData->GetExtent(extent);
vtkCamera *camera = background->GetActiveCamera();
camera->ParallelProjectionOn();
double xc = origin[0] + 0.5 * (extent[0] + extent[1]) * spacing[0];
double yc = origin[1] + 0.5 * (extent[2] + extent[3]) * spacing[1];
double yd = (extent[3] - extent[2] + 1) * spacing[1];
double d = camera->GetDistance();
camera->SetParallelScale(0.5 * yd);
camera->SetFocalPoint(xc, yc, 0.0);
camera->SetPosition(xc, yc, d);
}
int main() {
vtkNew<vtkNamedColors> colors;
vtkNew<vtkRenderer> Euler, Background, Lagrange;
Euler->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());
Background->SetLayer(0);
Background->InteractiveOff();
Euler->SetLayer(1);
Euler->InteractiveOff();
Lagrange->SetLayer(2);
renderCoordinates(Euler, colors);
renderBackground(Background);
vtkNew<vtkRenderWindow> renWin;
renWin->AddRenderer(ren);
renWin->SetSize(900, 600);
renWin->SetNumberOfLayers(3);
// renWin->SetNumberOfLayers(2);
renWin->AddRenderer(Background);
renWin->AddRenderer(Euler);
renWin->AddRenderer(Lagrange);
renWin->SetWindowName("Simulation");
renWin->SetSize(661, 661);
vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin);
renWin->Render();
iren->Start();
return EXIT_SUCCESS;
}