You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

240 lines
8.6 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkCameraInterpolator.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkCameraInterpolator
* @brief interpolate a series of cameras to update a new camera
*
* This class is used to interpolate a series of cameras to update a
* specified camera. Either linear interpolation or spline interpolation may
* be used. The instance variables currently interpolated include position,
* focal point, view up, view angle, parallel scale, and clipping range.
*
* To use this class, specify the type of interpolation to use, and add a
* series of cameras at various times "t" to the list of cameras from which to
* interpolate. Then to interpolate in between cameras, simply invoke the
* function InterpolateCamera(t,camera) where "camera" is the camera to be
* updated with interpolated values. Note that "t" should be in the range
* (min,max) times specified with the AddCamera() method. If outside this
* range, the interpolation is clamped. This class copies the camera information
* (as compared to referencing the cameras) so you do not need to keep separate
* instances of the camera around for each camera added to the list of cameras
* to interpolate.
*
* @warning
* The interpolator classes are initialized the first time InterpolateCamera()
* is called. Any later changes to the interpolators, or additions to the list of
* cameras to be interpolated, causes a reinitialization of the
* interpolators the next time InterpolateCamera() is invoked. Thus the
* best performance is obtained by 1) configuring the interpolators, 2) adding
* all the cameras, and 3) finally performing interpolation.
*
* @warning
* Currently position, focal point and view up are interpolated to define
* the orientation of the camera. Quaternion interpolation may be added in the
* future as an alternative interpolation method for camera orientation.
*/
#ifndef vtkCameraInterpolator_h
#define vtkCameraInterpolator_h
#include "vtkObject.h"
#include "vtkRenderingCoreModule.h" // For export macro
class vtkCamera;
class vtkCameraList;
class vtkTupleInterpolator;
class vtkCameraList;
class VTKRENDERINGCORE_EXPORT vtkCameraInterpolator : public vtkObject
{
public:
vtkTypeMacro(vtkCameraInterpolator, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Instantiate the class.
*/
static vtkCameraInterpolator* New();
/**
* Return the number of cameras in the list of cameras.
*/
int GetNumberOfCameras();
//@{
/**
* Obtain some information about the interpolation range. The numbers
* returned are undefined if the list of cameras is empty.
*/
double GetMinimumT();
double GetMaximumT();
//@}
/**
* Clear the list of cameras.
*/
void Initialize();
/**
* Add another camera to the list of cameras defining
* the camera function. Note that using the same time t value
* more than once replaces the previous camera value at t.
* At least one camera must be added to define a function.
*/
void AddCamera(double t, vtkCamera* camera);
/**
* Delete the camera at a particular parameter t. If there is no
* camera defined at location t, then the method does nothing.
*/
void RemoveCamera(double t);
/**
* Interpolate the list of cameras and determine a new camera (i.e.,
* fill in the camera provided). If t is outside the range of
* (min,max) values, then t is clamped to lie within this range.
*/
void InterpolateCamera(double t, vtkCamera* camera);
/**
* Enums to control the type of interpolation to use.
*/
enum
{
INTERPOLATION_TYPE_LINEAR = 0,
INTERPOLATION_TYPE_SPLINE,
INTERPOLATION_TYPE_MANUAL
};
//@{
/**
* These are convenience methods to switch between linear and spline
* interpolation. The methods simply forward the request for linear or
* spline interpolation to the instance variable interpolators (i.e.,
* position, focal point, clipping range, orientation, etc.)
* interpolators. Note that if the InterpolationType is set to "Manual",
* then the interpolators are expected to be directly manipulated and this
* class does not forward the request for interpolation type to its
* interpolators.
*/
vtkSetClampMacro(InterpolationType, int, INTERPOLATION_TYPE_LINEAR, INTERPOLATION_TYPE_MANUAL);
vtkGetMacro(InterpolationType, int);
void SetInterpolationTypeToLinear() { this->SetInterpolationType(INTERPOLATION_TYPE_LINEAR); }
void SetInterpolationTypeToSpline() { this->SetInterpolationType(INTERPOLATION_TYPE_SPLINE); }
void SetInterpolationTypeToManual() { this->SetInterpolationType(INTERPOLATION_TYPE_MANUAL); }
//@}
//@{
/**
* Set/Get the tuple interpolator used to interpolate the position portion
* of the camera. Note that you can modify the behavior of the interpolator
* (linear vs spline interpolation; change spline basis) by manipulating
* the interpolator instances directly.
*/
virtual void SetPositionInterpolator(vtkTupleInterpolator*);
vtkGetObjectMacro(PositionInterpolator, vtkTupleInterpolator);
//@}
//@{
/**
* Set/Get the tuple interpolator used to interpolate the focal point portion
* of the camera. Note that you can modify the behavior of the interpolator
* (linear vs spline interpolation; change spline basis) by manipulating
* the interpolator instances directly.
*/
virtual void SetFocalPointInterpolator(vtkTupleInterpolator*);
vtkGetObjectMacro(FocalPointInterpolator, vtkTupleInterpolator);
//@}
//@{
/**
* Set/Get the tuple interpolator used to interpolate the view up portion
* of the camera. Note that you can modify the behavior of the interpolator
* (linear vs spline interpolation; change spline basis) by manipulating
* the interpolator instances directly.
*/
virtual void SetViewUpInterpolator(vtkTupleInterpolator*);
vtkGetObjectMacro(ViewUpInterpolator, vtkTupleInterpolator);
//@}
//@{
/**
* Set/Get the tuple interpolator used to interpolate the view angle portion
* of the camera. Note that you can modify the behavior of the interpolator
* (linear vs spline interpolation; change spline basis) by manipulating
* the interpolator instances directly.
*/
virtual void SetViewAngleInterpolator(vtkTupleInterpolator*);
vtkGetObjectMacro(ViewAngleInterpolator, vtkTupleInterpolator);
//@}
//@{
/**
* Set/Get the tuple interpolator used to interpolate the parallel scale portion
* of the camera. Note that you can modify the behavior of the interpolator
* (linear vs spline interpolation; change spline basis) by manipulating
* the interpolator instances directly.
*/
virtual void SetParallelScaleInterpolator(vtkTupleInterpolator*);
vtkGetObjectMacro(ParallelScaleInterpolator, vtkTupleInterpolator);
//@}
//@{
/**
* Set/Get the tuple interpolator used to interpolate the clipping range portion
* of the camera. Note that you can modify the behavior of the interpolator
* (linear vs spline interpolation; change spline basis) by manipulating
* the interpolator instances directly.
*/
virtual void SetClippingRangeInterpolator(vtkTupleInterpolator*);
vtkGetObjectMacro(ClippingRangeInterpolator, vtkTupleInterpolator);
//@}
/**
* Override GetMTime() because we depend on the interpolators which may be
* modified outside of this class.
*/
vtkMTimeType GetMTime() override;
protected:
vtkCameraInterpolator();
~vtkCameraInterpolator() override;
// Control the interpolation type
int InterpolationType;
// These perform the interpolation
vtkTupleInterpolator* PositionInterpolator;
vtkTupleInterpolator* FocalPointInterpolator;
vtkTupleInterpolator* ViewUpInterpolator;
vtkTupleInterpolator* ViewAngleInterpolator;
vtkTupleInterpolator* ParallelScaleInterpolator;
vtkTupleInterpolator* ClippingRangeInterpolator;
// Initialize the interpolating splines
int Initialized;
vtkTimeStamp InitializeTime;
void InitializeInterpolation();
// Hold the list of cameras. PIMPL'd STL list.
vtkCameraList* CameraList;
private:
vtkCameraInterpolator(const vtkCameraInterpolator&) = delete;
void operator=(const vtkCameraInterpolator&) = delete;
};
#endif