You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.7 KiB
148 lines
5.7 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkQuaternionInterpolator.h,v $
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkQuaternionInterpolator - interpolate a quaternion
|
|
// .SECTION Description
|
|
// 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.
|
|
//
|
|
// .SECTION Caveats
|
|
// 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.
|
|
//
|
|
// 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.
|
|
|
|
|
|
#ifndef __vtkQuaternionInterpolator_h
|
|
#define __vtkQuaternionInterpolator_h
|
|
|
|
#include "vtkObject.h"
|
|
|
|
struct vtkQuaternion;
|
|
class vtkQuaternionList;
|
|
|
|
|
|
class VTK_RENDERING_EXPORT vtkQuaternionInterpolator : public vtkObject
|
|
{
|
|
public:
|
|
vtkTypeRevisionMacro(vtkQuaternionInterpolator, vtkObject);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Instantiate the class.
|
|
static vtkQuaternionInterpolator* New();
|
|
|
|
// Description:
|
|
// Return the number of quaternions in the list of quaternions to be
|
|
// interpolated.
|
|
int GetNumberOfQuaternions();
|
|
|
|
// Description:
|
|
// 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();
|
|
|
|
// Description:
|
|
// Reset the class so that it contains no data; i.e., the array of (t,q[4])
|
|
// information is discarded.
|
|
void Initialize();
|
|
|
|
// Description:
|
|
// 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 functios.
|
|
void AddQuaternion(double t, double q[4]);
|
|
|
|
// Description:
|
|
// 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);
|
|
|
|
// Description:
|
|
// 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, double q[4]);
|
|
|
|
//BTX
|
|
// Description:
|
|
// Enums to control the type of interpolation to use.
|
|
enum {INTERPOLATION_TYPE_LINEAR=0,
|
|
INTERPOLATION_TYPE_SPLINE
|
|
};
|
|
//ETX
|
|
|
|
// Description:
|
|
// Specify which type of function to use for interpolation. By default
|
|
// (SetInterpolationFunctionToSpline()), cubic spline interpolation using a
|
|
// modifed 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();
|
|
virtual ~vtkQuaternionInterpolator();
|
|
|
|
// Specify the type of interpolation to use
|
|
int InterpolationType;
|
|
|
|
// Internal variables for interpolation functions
|
|
vtkQuaternionList *QuaternionList; //used for linear quaternion interpolation
|
|
|
|
// Internal method for spherical, linear interpolation
|
|
void Slerp(double t, double q0[4], double q1[4], double q[4]);
|
|
|
|
// Internal methods supporting spline interpolation
|
|
static void InnerPoint(double q0[4], double q1[4], double q2[4], double q[4]);
|
|
|
|
private:
|
|
vtkQuaternionInterpolator(const vtkQuaternionInterpolator&); // Not implemented.
|
|
void operator=(const vtkQuaternionInterpolator&); // Not implemented.
|
|
|
|
};
|
|
|
|
#endif
|
|
|