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
213 lines
7.5 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
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
|