[vtkusers] vtkCamera->GetFrustumPlanes segfault from a boost thread

Justin Rosen jmylesrosen at gmail.com
Sat Apr 28 18:23:13 EDT 2012


If anyone one knows a bit about using vtk and boost threads I'd really
appreciate the help.  I'm fairly new to vtk and threads in general and I'm
trying to figure out why calling vtkCamera->GetFrustumPlanes from a boost
thread eventually segfaults.  It takes quite a few of iterations before the
segfault occurs.

The general idea is that I have main application UI and a worker thread in
the background which'll be doing some processing (Eventually
updating/modifying a list of actors).  At the moment I'm just trying to get
the cameras view frustum...

If I remove the call to camera->GetFrustumPlanes the application runs
without seg faulting.  Any idea what I may be doing wrong?

void workerFunc(vtkCamera *camera)
{
  double prevUp[3] = {0, 0, 0};
  double prevFocal[3] = {0, 0, 0};
  double prevPos[3] = {0, 0, 0};

  while(true){
    double *up = camera->GetViewUp();
    double *focal = camera->GetFocalPoint();
    double *pos = camera->GetPosition();

    bool viewpointChanged = false;

    // Check up vector
    if(up[0] != prevUp[0] || up[1] != prevUp[1] || up[2] != prevUp[2])
      viewpointChanged = true;

    // Check focal point
    if(focal[0] != prevFocal[0] || focal[1] != prevFocal[1] || focal[2] !=
prevFocal[2])
      viewpointChanged = true;

    // Check position
    if(pos[0] != prevPos[0] || pos[1] != prevPos[1] || pos[2] != prevPos[2])
      viewpointChanged = true;

    // If the viewpoints changed get the cameras frustum
    if (viewpointChanged){
      prevUp[0] = up[0]; prevUp[1] = up[1]; prevUp[2] = up[2];
      prevFocal[0] = focal[0]; prevFocal[1] = focal[1]; prevFocal[2] =
focal[2];
      prevPos[0] = pos[0]; prevPos[1] = pos[1]; prevPos[2] = pos[2];

      cout << "View Changed" << endl;
      cout << "Up: <" << up[0] << ", " << up[1] << ", " << up[2] << ">" <<
endl;
      cout << "Focal: <" << focal[0] << ", " << focal[1] << ", " <<
focal[2] << ">" << endl;
      cout << "Pos: <" << pos[0] << ", " << pos[1] << ", " << pos[2] << ">"
<< endl;

      double planes[24];
      camera->GetFrustumPlanes(1, planes);

      for (int i=0; i < 6; i++){
        cout << planes[(i*4)] << "x + " << planes[(i*4)+1] << "y + " <<
planes[(i*4)+2] << "z + " << planes[(i*4)+3] << endl;
      }
    }
  }
}

int
main (int argc, char* argv[])
{
  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New
();
  vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New ();
  vtkSmartPointer<vtkRenderWindow> window =
vtkSmartPointer<vtkRenderWindow>::New ();

  window->AddRenderer (renderer);
  window->SetSize (500, 500);
  interactor->SetRenderWindow (window);

  interactor->Initialize();

  boost::thread workerThread(workerFunc, renderer->GetActiveCamera());

  window->Render ();

  vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New ();
  interactor->SetInteractorStyle (style);

  interactor->Start ();

  return 0;
}


Thanks!
Justin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120428/214624d3/attachment.htm>


More information about the vtkusers mailing list