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.

164 lines
5.6 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkQuaternionInterpolator.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 vtkQuaternionInterpolator
* @brief interpolate a quaternion
*
* This class is used to interpolate a series of quaternions representing
* the rotations of a 3D object. The interpolation may be linear in form
* (using spherical linear interpolation SLERP), or via spline interpolation
* (using SQUAD). In either case the interpolation is specialized to
* quaternions since the interpolation occurs on the surface of the unit
* quaternion sphere.
*
* To use this class, specify at least two pairs of (t,q[4]) with the
* AddQuaternion() method. Next interpolate the tuples with the
* InterpolateQuaternion(t,q[4]) method, where "t" must be in the range of
* (t_min,t_max) parameter values specified by the AddQuaternion() method (t
* is clamped otherwise), and q[4] is filled in by the method.
*
* There are several important background references. Ken Shoemake described
* the practical application of quaternions for the interpolation of rotation
* (K. Shoemake, "Animating rotation with quaternion curves", Computer
* Graphics (Siggraph '85) 19(3):245--254, 1985). Another fine reference
* (available on-line) is E. B. Dam, M. Koch, and M. Lillholm, Technical
* Report DIKU-TR-98/5, Dept. of Computer Science, University of Copenhagen,
* Denmark.
*
* @warning
* Note that for two or less quaternions, Slerp (linear) interpolation is
* performed even if spline interpolation is requested. Also, the tangents to
* the first and last segments of spline interpolation are (arbitrarily)
* defined by repeating the first and last quaternions.
*
* @warning
* There are several methods particular to quaternions (norms, products,
* etc.) implemented interior to this class. These may be moved to a separate
* quaternion class at some point.
*
* @sa
* vtkQuaternion
*/
#ifndef vtkQuaternionInterpolator_h
#define vtkQuaternionInterpolator_h
#include "vtkCommonMathModule.h" // For export macro
#include "vtkObject.h"
class vtkQuaterniond;
class vtkQuaternionList;
class VTKCOMMONMATH_EXPORT vtkQuaternionInterpolator : public vtkObject
{
public:
vtkTypeMacro(vtkQuaternionInterpolator, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Instantiate the class.
*/
static vtkQuaternionInterpolator* New();
/**
* Return the number of quaternions in the list of quaternions to be
* interpolated.
*/
int GetNumberOfQuaternions();
//@{
/**
* 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. This is a convenience
* method for interpolation.
*/
double GetMinimumT();
double GetMaximumT();
//@}
/**
* Reset the class so that it contains no data; i.e., the array of (t,q[4])
* information is discarded.
*/
void Initialize();
//@{
/**
* Add another quaternion to the list of quaternions to be interpolated.
* Note that using the same time t value more than once replaces the
* previous quaternion at t. At least one quaternions must be added to
* define an interpolation functions.
*/
void AddQuaternion(double t, const vtkQuaterniond& q);
void AddQuaternion(double t, double q[4]);
//@}
/**
* Delete the quaternion at a particular parameter t. If there is no
* quaternion tuple defined at t, then the method does nothing.
*/
void RemoveQuaternion(double t);
//@{
/**
* Interpolate the list of quaternions and determine a new quaternion
* (i.e., fill in the quaternion provided). If t is outside the range of
* (min,max) values, then t is clamped to lie within the range.
*/
void InterpolateQuaternion(double t, vtkQuaterniond& q);
void InterpolateQuaternion(double t, double q[4]);
//@}
/**
* Enums to control the type of interpolation to use.
*/
enum
{
INTERPOLATION_TYPE_LINEAR = 0,
INTERPOLATION_TYPE_SPLINE
};
//@{
/**
* Specify which type of function to use for interpolation. By default
* (SetInterpolationFunctionToSpline()), cubic spline interpolation using a
* modified Kochanek basis is employed. Otherwise, if
* SetInterpolationFunctionToLinear() is invoked, linear spherical interpolation
* is used between each pair of quaternions.
*/
vtkSetClampMacro(InterpolationType, int, INTERPOLATION_TYPE_LINEAR, INTERPOLATION_TYPE_SPLINE);
vtkGetMacro(InterpolationType, int);
void SetInterpolationTypeToLinear() { this->SetInterpolationType(INTERPOLATION_TYPE_LINEAR); }
void SetInterpolationTypeToSpline() { this->SetInterpolationType(INTERPOLATION_TYPE_SPLINE); }
//@}
protected:
vtkQuaternionInterpolator();
~vtkQuaternionInterpolator() override;
// Specify the type of interpolation to use
int InterpolationType;
// Internal variables for interpolation functions
vtkQuaternionList* QuaternionList; // used for linear quaternion interpolation
private:
vtkQuaternionInterpolator(const vtkQuaternionInterpolator&) = delete;
void operator=(const vtkQuaternionInterpolator&) = delete;
};
#endif