Detecting visible mesh faces in a scene rendered outside of VTK
Hi,
I'm currently attempting to select all faces of a mesh visible to a camera in a scene rendered through Qt & Ogre. Ogre doesn't seem to provide much in the way of this, and I'm already loading the mesh into a vtkPolyData object from an STL file, so I figured I could build a vtkRenderer using the attributes from Ogre, then use a vtkHardwareSelector to get the visible faces there.
I've thrown together some code which I believe should work, however I am getting a color buffer depth error when calling the vtkHardwareSelector::Select() method.
The code in question is shown below. mesh_
is an attribute containing the vtkPolyData object, which is loading fine:
std::vector<int> Mesh::getVisibleFacesInRange(Ogre::Viewport* viewport, double radius, double click_x, double click_y)
{
std::vector<int> result;
//TODO: Pull out into Ogre Viewport -> VTK Renderer helper
ROS_INFO("Building VTK Renderer");
Ogre::Camera* camera = viewport->getCamera();
Ogre::Matrix4 ogre_world;
camera->getWorldTransforms(&ogre_world);
double world[16];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
world[(i * 4) + j] = ogre_world[i][j];
}
}
vtkRenderer* renderer = vtkRenderer::New();
vtkCamera* vtk_camera = renderer->MakeCamera();
vtk_camera->SetModelTransformMatrix(world);
Ogre::Vector3 position = camera->getPosition();
double pos[3] = {position.x, position.y, position.z};
vtk_camera->SetPosition(pos);
Ogre::Vector3 up_vec = camera->getUp();
double up[3] = {up_vec.x, up_vec.y, up_vec.z};
vtk_camera->SetViewUp(up);
Ogre::Vector3 focal_point = position + camera->getDirection();
double focal[3] = {focal_point.x, focal_point.y, focal_point.z};
vtk_camera->SetFocalPoint(focal);
vtk_camera->SetViewAngle(camera->getFOVy().valueDegrees());
vtk_camera->SetFocalDistance(camera->getFocalLength());
renderer->SetActiveCamera(vtk_camera);
vtkRenderWindow* window = vtkRenderWindow::New();
window->AddRenderer(renderer);
window->SetSize(viewport->getWidth(), viewport->getHeight());
renderer->Clear();
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputData(mesh_);
mapper->Update();
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
renderer->AddActor(actor);
window->Render();
ROS_INFO("Built VTK Renderer");
vtkOpenGLHardwareSelector* selector = vtkOpenGLHardwareSelector::New();
selector->SetFieldAssociation(vtkDataObject::FieldAssociations::FIELD_ASSOCIATION_CELLS);
selector->SetRenderer(renderer);
selector->SetArea(click_x - radius, click_y - radius, click_x + radius, click_y + radius);
vtkSelection* selection = vtkSelection::New();
ROS_INFO("Selecting visible cells");
selection = selector->Select();
...
}
Along with the logs:
[ INFO] [1626871024.589000972]: Built VTK Renderer
[ INFO] [1626871024.589327747]: Selecting visible cells
2021-07-21 13:37:04.589 ( 8.983s) [ 7662AA80]vtkHardwareSelector.cxx:279 ERR| vtkOpenGLHardwareSelector (0x55fdd906b1c0): Color buffer depth must be at least 8 bit. Currently: 1, 0, 2109690372
Apologies for the messy code and unfamiliarity with VTK. I'd much appreciate any help, and if there is a cleaner way of achieving this I'd love to hear it