working on rendering bg image; rudimentary version complete
This commit is contained in:
parent
985fd6b9ed
commit
57815c64ac
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue