[vtkusers] Problem in using vtkOrientationMarkerWidget

Dean Inglis dean.inglis at sympatico.ca
Fri Aug 10 08:45:06 EDT 2007


Hi Jean-Do,

you do not need to set the renderer explicitly
for the widget, in fact it is incorrect to do this,
just set the interactor:

  widget->SetOrientationMarker(assemble);
//  widget->SetCurrentRenderer(ren);
  widget->SetInteractor(iren);
  widget->SetEnabled(1);
  widget->SetInteractive(0);
  widget->SetViewport(0., 0., 0.4, 0.4);

this is because the marker widget maintains
a separate renderer to render itself in the overlay plane,
but in the same renderwindow as your main renderer that
you added your cylinder to.

Dean


Hi,

I'm having troubles in using correctly the vtkOrientationMarkerWidget.

Starting from on a test shipped with vtk, I just tried to incorporate a
vtkOrientationMarkerWidget by adding :
  // Add a vtkOrientationMarkerWidget
  vtkOrientationMarkerWidget* widget  = vtkOrientationMarkerWidget::New();
  vtkAnnotatedCubeActor* act1 = vtkAnnotatedCubeActor::New();
  act1->SetFaceTextScale(0.5);
  vtkAxesActor* act2 = vtkAxesActor::New();
  vtkAssembly* assemble = vtkAssembly::New();
  assemble->AddPart(act1);
  assemble->AddPart(act2);
  widget->SetOrientationMarker(assemble);
  widget->SetCurrentRenderer(ren);
  widget->SetInteractor(iren);
  widget->SetEnabled(1);
  widget->SetInteractive(0);
  widget->SetViewport(0., 0., 0.4, 0.4);

The full example is given at bottom of this email.

Well, the trouble is that it does not given exactly what I need:
- ok there is an orientation marker in the left bottom corner of the output,
- but the main output (a cylinder) has disappeared from the output window
  and it is only displayed in the same viewport as the orientation widget.

I obviously missed some subtlety in the proper usage of
vtkOrientationMarkerWidget...

Any help welcomed.


Jean-Do

//
// Test for use of vtkOrientationMarkerWidget
//
#include "vtkCylinderSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkOrientationMarkerWidget.h"
#include "vtkAnnotatedCubeActor.h"
#include "vtkAxesActor.h"
#include "vtkAssembly.h"

int main()
{
  // This creates a polygonal cylinder model with eight circumferential
facets.
  vtkCylinderSource *cylinder = vtkCylinderSource::New();
  cylinder->SetResolution(8);

  // The mapper is responsible for pushing the geometry into the graphics
  // library. It may also do color mapping, if scalars or other attributes
  // are defined.
  vtkPolyDataMapper *cylinderMapper = vtkPolyDataMapper::New();
  cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

  // The actor is a grouping mechanism: besides the geometry (mapper), it
  // also has a property, transformation matrix, and/or texture map.
  // Here we set its color and rotate it -22.5 degrees.
  vtkActor *cylinderActor = vtkActor::New();
  cylinderActor->SetMapper(cylinderMapper);
  cylinderActor->GetProperty()->SetColor(1.0000, 0.3882, 0.2784);
  cylinderActor->RotateX(30.0);
  cylinderActor->RotateY(-45.0);

  // Create the graphics structure. The renderer renders into the
  // render window. The render window interactor captures mouse events
  // and will perform appropriate camera or actor manipulation
  // depending on the nature of the events.
  vtkRenderer *ren = vtkRenderer::New();
  vtkRenderWindow *renWin = vtkRenderWindow::New();

  renWin->AddRenderer(ren);

  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
  iren->SetRenderWindow(renWin);

  // Add the actors to the renderer, set the background and size
  ren->AddActor(cylinderActor);
  ren->SetBackground(0.1, 0.2, 0.4);
  renWin->SetSize(400, 400);

//////////////////////////////////////////
// Begin of add vtkOrientationMarkerWidget
//////////////////////////////////////////
  // Add a vtkOrientationMarkerWidget
  vtkOrientationMarkerWidget* widget  = vtkOrientationMarkerWidget::New();
  vtkAnnotatedCubeActor* act1 = vtkAnnotatedCubeActor::New();
  act1->SetFaceTextScale(0.5);
  vtkAxesActor* act2 = vtkAxesActor::New();
  vtkAssembly* assemble = vtkAssembly::New();
  assemble->AddPart(act1);
  assemble->AddPart(act2);
  widget->SetOrientationMarker(assemble);
  widget->SetCurrentRenderer(ren);
  widget->SetInteractor(iren);
  widget->SetEnabled(1);
  widget->SetInteractive(0);
  widget->SetViewport(0., 0., 0.4, 0.4);
//////////////////////////////////////////
// End of add vtkOrientationMarkerWidget
//////////////////////////////////////////


  // We'll zoom in a little by accessing the camera and invoking a "Zoom"
  // method on it.
  ren->ResetCamera();
  ren->GetActiveCamera()->Zoom(1.5);
  renWin->Render();

  // This starts the event loop and as a side effect causes an initial
render.
  iren->Start();

  // Exiting from here, we have to delete all the instances that
  // have been created.
  assemble->Delete();
  act2->Delete();
  act1->Delete();
  widget->Delete();
  cylinder->Delete();
  cylinderMapper->Delete();
  cylinderActor->Delete();
  ren->Delete();
  renWin->Delete();
  iren->Delete();

  return 0;
}




More information about the vtkusers mailing list