Hi there,
My team has been trying to replace the filter vtkGlyph3D
by its GPU version vtkGlyph3DMapper
, but seems like the mapper version does not support large coordinates very well as the filter do. Since in our project the point coordinates are frequently above 6000000
, I would like to know if we are missing any additional configuration; if its a limitation of this mapper or a mere lack of understanding. Thank you!
(I suspect this topic from @cobo might be related: Struggling with geographic coordinates, but I’m not sure how that could apply for mappers)
Follow a simple code example comparing the two approaches given the same input data:
Glyph3dMapper vs Glyph3d
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCubeSource.h>
#include <vtkFloatArray.h>
#include <vtkGlyph3DMapper.h>
#include <vtkNamedColors.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkUnsignedCharArray.h>
int main(int, char*[]) {
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->SetDataTypeToDouble();
points->InsertNextPoint(6000000, 6000000, 6000000);
points->InsertNextPoint(6000001, 6000001, 6000001);
points->InsertNextPoint(6000002, 6000002, 6000002);
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New();
// ### Glyph3d
vtkSmartPointer<vtkGlyph3D> glyph3D = vtkSmartPointer<vtkGlyph3D>::New();
glyph3D->SetSourceConnection(cubeSource->GetOutputPort());
glyph3D->SetInputData(polydata);
glyph3D->Update();
vtkSmartPointer<vtkPolyDataMapper> glyph_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
glyph_mapper->SetInputConnection(glyph3D->GetOutputPort());
vtkSmartPointer<vtkActor> actor_glyph = vtkSmartPointer<vtkActor>::New();
actor_glyph->SetMapper(glyph_mapper);
// ### Glyph3dMapper
vtkSmartPointer<vtkGlyph3DMapper> glyph3Dmapper = vtkSmartPointer<vtkGlyph3DMapper>::New();
glyph3Dmapper->SetSourceConnection(cubeSource->GetOutputPort());
glyph3Dmapper->SetInputData(polydata);
glyph3Dmapper->Update();
vtkSmartPointer<vtkActor> actor_glyph_3dmapper = vtkSmartPointer<vtkActor>::New();
actor_glyph_3dmapper->SetMapper(glyph3Dmapper);
// Create a renderer, render window, and interactor
// Define viewport ranges
// (xmin, ymin, xmax, ymax)
double leftViewport[4] = {0.0, 0.0, 0.5, 1.0};
double rightViewport[4] = {0.5, 0.0, 1.0, 1.0};
// Setup both renderers
vtkSmartPointer<vtkRenderer> leftRenderer = vtkSmartPointer<vtkRenderer>::New();
leftRenderer->SetViewport(leftViewport);
leftRenderer->SetBackground(.6, .5, .4);
vtkSmartPointer<vtkRenderer> rightRenderer = vtkSmartPointer<vtkRenderer>::New();
rightRenderer->SetViewport(rightViewport);
rightRenderer->SetBackground(.4, .5, .6);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(leftRenderer);
renderWindow->AddRenderer(rightRenderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the actor to the scene
leftRenderer->AddActor(actor_glyph_3dmapper);
rightRenderer->AddActor(actor_glyph);
// Position the camera
leftRenderer->GetActiveCamera()->SetPosition(5999990, 6000000, 6000000);
leftRenderer->GetActiveCamera()->SetFocalPoint(6000000, 6000000, 6000000);
rightRenderer->GetActiveCamera()->SetPosition(5999990, 6000000, 6000000);
rightRenderer->GetActiveCamera()->SetFocalPoint(6000000, 6000000, 6000000);
// Render and interact
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
Thank you for your time,
Rodrigo Figueiredo.