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