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.

213 lines
7.5 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkTransformInterpolator.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 vtkTransformInterpolator
* @brief interpolate a series of transformation matrices
*
* This class is used to interpolate a series of 4x4 transformation
* matrices. Position, scale and orientation (i.e., rotations) are
* interpolated separately, and can be interpolated linearly or with a spline
* function. Note that orientation is interpolated using quaternions via
* SLERP (spherical linear interpolation) or the special vtkQuaternionSpline
* class.
*
* To use this class, specify at least two pairs of (t,transformation matrix)
* with the AddTransform() method. Then interpolated the transforms with the
* InterpolateTransform(t,transform) method, where "t" must be in the range
* of (min,max) times specified by the AddTransform() method.
*
* By default, spline interpolation is used for the interpolation of the
* transformation matrices. The position, scale and orientation of the
* matrices are interpolated with instances of the classes
* vtkTupleInterpolator (position,scale) and vtkQuaternionInterpolator
* (rotation). The user can override the interpolation behavior by gaining
* access to these separate interpolation classes. These interpolator
* classes (vtkTupleInterpolator and vtkQuaternionInterpolator) can be
* modified to perform linear versus spline interpolation, and/or different
* spline basis functions can be specified.
*
* @warning
* The interpolator classes are initialized when the InterpolateTransform()
* is called. Any changes to the interpolators, or additions to the list of
* transforms to be interpolated, causes a reinitialization of the
* interpolators the next time InterpolateTransform() is invoked. Thus the
* best performance is obtained by 1) configuring the interpolators, 2) adding
* all the transforms, and 3) finally performing interpolation.
*/
#ifndef vtkTransformInterpolator_h
#define vtkTransformInterpolator_h
#include "vtkObject.h"
#include "vtkRenderingCoreModule.h" // For export macro
class vtkTransform;
class vtkMatrix4x4;
class vtkProp3D;
class vtkTupleInterpolator;
class vtkQuaternionInterpolator;
class vtkTransformList;
class VTKRENDERINGCORE_EXPORT vtkTransformInterpolator : public vtkObject
{
public:
vtkTypeMacro(vtkTransformInterpolator, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Instantiate the class.
*/
static vtkTransformInterpolator* New();
/**
* Return the number of transforms in the list of transforms.
*/
int GetNumberOfTransforms();
//@{
/**
* Obtain some information about the interpolation range. The numbers
* returned (corresponding to parameter t, usually thought of as time)
* are undefined if the list of transforms is empty.
*/
double GetMinimumT();
double GetMaximumT();
//@}
/**
* Clear the list of transforms.
*/
void Initialize();
//@{
/**
* Add another transform to the list of transformations defining
* the transform function. Note that using the same time t value
* more than once replaces the previous transform value at t.
* At least two transforms must be added to define a function.
* There are variants to this method depending on whether you are
* adding a vtkTransform, vtkMaxtirx4x4, and/or vtkProp3D.
*/
void AddTransform(double t, vtkTransform* xform);
void AddTransform(double t, vtkMatrix4x4* matrix);
void AddTransform(double t, vtkProp3D* prop3D);
//@}
/**
* Delete the transform at a particular parameter t. If there is no
* transform defined at location t, then the method does nothing.
*/
void RemoveTransform(double t);
/**
* Interpolate the list of transforms and determine a new transform (i.e.,
* fill in the transformation provided). If t is outside the range of
* (min,max) values, then t is clamped.
*/
void InterpolateTransform(double t, vtkTransform* xform);
/**
* 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 position, scale and orientation
* 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 transformation matrix. Note that you can modify the behavior of
* the interpolator (linear vs spline interpolation; change spline basis)
* by manipulating the interpolator instances.
*/
virtual void SetPositionInterpolator(vtkTupleInterpolator*);
vtkGetObjectMacro(PositionInterpolator, vtkTupleInterpolator);
//@}
//@{
/**
* Set/Get the tuple interpolator used to interpolate the scale portion
* of the transformation matrix. Note that you can modify the behavior of
* the interpolator (linear vs spline interpolation; change spline basis)
* by manipulating the interpolator instances.
*/
virtual void SetScaleInterpolator(vtkTupleInterpolator*);
vtkGetObjectMacro(ScaleInterpolator, vtkTupleInterpolator);
//@}
//@{
/**
* Set/Get the tuple interpolator used to interpolate the orientation portion
* of the transformation matrix. Note that you can modify the behavior of
* the interpolator (linear vs spline interpolation; change spline basis)
* by manipulating the interpolator instances.
*/
virtual void SetRotationInterpolator(vtkQuaternionInterpolator*);
vtkGetObjectMacro(RotationInterpolator, vtkQuaternionInterpolator);
//@}
/**
* Override GetMTime() because we depend on the interpolators which may be
* modified outside of this class.
*/
vtkMTimeType GetMTime() override;
protected:
vtkTransformInterpolator();
~vtkTransformInterpolator() override;
// Control the interpolation type
int InterpolationType;
// Interpolators
vtkTupleInterpolator* PositionInterpolator;
vtkTupleInterpolator* ScaleInterpolator;
vtkQuaternionInterpolator* RotationInterpolator;
// Initialize the interpolating splines
int Initialized;
vtkTimeStamp InitializeTime;
void InitializeInterpolation();
// Keep track of inserted data
vtkTransformList* TransformList;
private:
vtkTransformInterpolator(const vtkTransformInterpolator&) = delete;
void operator=(const vtkTransformInterpolator&) = delete;
};
#endif