Skip to content
Snippets Groups Projects

Improve compass widget example

Merged Andrew Maclean requested to merge improve-CompassWidget-example into master
4 files
+ 162
38
Compare changes
  • Side-by-side
  • Inline
Files
4
#include <vtkActor.h>
#include <vtkArrowSource.h>
#include <vtkAnnotatedCubeActor.h>
#include <vtkCamera.h>
#include <vtkCommand.h>
#include <vtkCompassRepresentation.h>
#include <vtkCompassWidget.h>
#include <vtkInteractorStyleTrackball.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
int main(int, char*[])
#if VTK_VERSION_NUMBER >= 90220220831ULL
#define VTK_HAS_IMPROVED_COMPASSWIDGETREPRESENTATION 1
#endif
class vtkICWValueChangedCallback : public vtkCommand
{
vtkNew<vtkNamedColors> colors;
public:
static vtkICWValueChangedCallback* New()
{
return new vtkICWValueChangedCallback();
}
virtual void Execute(vtkObject* caller, unsigned long vtkNotUsed(eventId),
void* vtkNotUsed(callData))
{
vtkCompassWidget* widget = vtkCompassWidget::SafeDownCast(caller);
vtkCamera* camera = widget->GetCurrentRenderer()->GetActiveCamera();
vtkNew<vtkArrowSource> arrowSource;
// calculate new camera position from compass widget parameters
double distance = widget->GetDistance();
double tilt = widget->GetTilt();
double heading = widget->GetHeading();
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(arrowSource->GetOutputPort());
double pos[3] = {0, 0, 0};
pos[0] = distance * cos(vtkMath::RadiansFromDegrees(heading)) *
cos(vtkMath::RadiansFromDegrees(tilt));
pos[1] = distance * sin(vtkMath::RadiansFromDegrees(heading)) *
cos(vtkMath::RadiansFromDegrees(tilt));
pos[2] = distance * sin(vtkMath::RadiansFromDegrees(tilt));
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(colors->GetColor3d("PeachPuff").GetData());
camera->SetPosition(pos);
camera->SetFocalPoint(0, 0, 0);
camera->SetViewUp(0, 0, 1);
camera->SetClippingRange(0.1, distance + 1);
widget->GetCurrentRenderer()->Render();
}
vtkICWValueChangedCallback()
{
}
};
int main(int, char*[])
{
vtkNew<vtkNamedColors> colors;
// a cube with text on its faces
vtkNew<vtkAnnotatedCubeActor> actor;
actor->GetTextEdgesProperty()->SetColor(
colors->GetColor3d("Black").GetData());
actor->GetCubeProperty()->SetColor(colors->GetColor3d("PeachPuff").GetData());
// a renderer and render window
vtkNew<vtkRenderer> renderer;
@@ -35,12 +70,22 @@ int main(int, char*[])
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow);
// Create the widget and its representation
// create the widget and its representation
vtkNew<vtkCompassRepresentation> compassRepresentation;
#ifdef VTK_HAS_IMPROVED_COMPASSWIDGETREPRESENTATION
compassRepresentation->SetMinimumDistance(2);
compassRepresentation->SetMaximumDistance(10);
#endif
vtkNew<vtkCompassWidget> compassWidget;
compassWidget->SetInteractor(renderWindowInteractor);
compassWidget->SetRepresentation(compassRepresentation);
compassWidget->SetDistance(5.0);
// create the callback
vtkNew<vtkICWValueChangedCallback> valueChangedCallback;
compassWidget->AddObserver(vtkCommand::WidgetValueChangedEvent,
valueChangedCallback);
// add the actors to the scene
renderer->AddActor(actor);
@@ -52,8 +97,11 @@ int main(int, char*[])
renderWindow->Render();
compassWidget->EnabledOn();
vtkNew<vtkInteractorStyleTrackballCamera> style;
renderWindowInteractor->SetInteractorStyle(style);
// no interactor style - camera is moved by widget callback
renderWindowInteractor->SetInteractorStyle(nullptr);
// set camera to initial position
compassWidget->InvokeEvent(vtkCommand::WidgetValueChangedEvent);
// begin interaction
renderWindowInteractor->Start();
Loading