quaternion.h
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /****************************************************************************
  2.   quaternion.h - A quaternion class
  3.   GLUI User Interface Toolkit (LGPL)
  4.   Copyright (c) 1998 Paul Rademacher
  5.   ---------------------------------------------------------------------
  6.   WWW:    http://sourceforge.net/projects/glui/
  7.   Forums: http://sourceforge.net/forum/?group_id=92496
  8.   This library is free software; you can redistribute it and/or
  9.   modify it under the terms of the GNU Lesser General Public
  10.   License as published by the Free Software Foundation; either
  11.   version 2.1 of the License, or (at your option) any later version.
  12.   This library is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.   Lesser General Public License for more details.
  16.   You should have received a copy of the GNU Lesser General Public
  17.   License along with this library; if not, write to the Free Software
  18.   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19. *****************************************************************************/
  20. #ifndef GLUI_QUATERNION_H
  21. #define GLUI_QUATERNION_H
  22. #include "algebra3.h"
  23. #include <cstdio>
  24. /* this line defines a new type: pointer to a function which returns a */
  25. /* float and takes as argument a float */
  26. typedef float (*V_FCT_PTR)(float);
  27. /****************************************************************
  28.  *                    Quaternion                                *
  29.  ****************************************************************/
  30. class quat
  31. {
  32.   /*protected: */
  33. public:
  34.   vec3  v;  /* vector component */
  35.   float s;  /* scalar component */
  36.   /*public: */
  37.   
  38.   /* Constructors */
  39.   quat();
  40.   quat(float x, float y, float z, float w);
  41.   quat(const vec3 &v, float s); 
  42.   quat(float   s, const vec3 &v);
  43.   quat(const float  *d);     /* copy from four-element float array  */
  44.   quat(const double *f);     /* copy from four-element double array */
  45.   quat(const quat   &q);     /* copy from other quat                */
  46.   /* Assignment operators */
  47.   quat  &operator  = (const quat &v);      /* assignment of a quat            */
  48.   quat  &operator += (const quat &v);      /* incrementation by a quat        */
  49.   quat  &operator -= (const quat &v);      /* decrementation by a quat        */
  50.   quat  &operator *= (float d);      /* multiplication by a constant    */
  51.   quat  &operator /= (float d);      /* division by a constant          */
  52.   
  53.   /* special functions */
  54.   
  55.   float  length() const;                   /* length of a quat                */
  56.   float  length2() const;                  /* squared length of a quat        */
  57.   quat  &normalize();                      /* normalize a quat                */
  58.   quat  &apply(V_FCT_PTR fct);             /* apply a func. to each component */
  59.   vec3   xform(const vec3 &v );            /* q*v*q-1                         */
  60.   mat4   to_mat4() const;
  61.   void   set_angle(float f);               /* set rot angle (degrees)         */
  62.   void   scale_angle(float f);             /* scale rot angle (degrees)       */
  63.   float  get_angle() const;                /* set rot angle (degrees)         */
  64.   vec3   get_axis()  const;                /* get axis                        */
  65.   void   print( FILE *file, const char *name ) const;  /* print to a file     */
  66.         float &operator [] (int i);        /* indexing                        */
  67.   const float &operator [] (int i) const;  /* indexing                        */
  68.   void   set(float x, float y, float z);   /* set quat                        */
  69.   void   set(const vec3 &v, float s);      /* set quat                        */
  70.   /* friends */
  71.   friend quat operator - (const quat &v);                   /* -q1            */
  72.   friend quat operator + (const quat &a, const quat &b);    /* q1 + q2        */
  73.   friend quat operator - (const quat &a, const quat &b);    /* q1 - q2        */
  74.   friend quat operator * (const quat &a, float d);          /* q1 * 3.0       */
  75.   friend quat operator * (float d, const quat &a);          /* 3.0 * q1       */
  76.   friend quat operator * (const quat &a, const quat &b);    /* q1 * q2        */
  77.   friend quat operator / (const quat &a, float d);          /* q1 / 3.0       */
  78.   friend int operator == (const quat &a, const quat &b);    /* q1 == q2 ?     */
  79.   friend int operator != (const quat &a, const quat &b);    /* q1 != q2 ?     */
  80.   friend void swap(quat &a, quat &b);                       /* swap q1  &q2   */
  81.   /*friend quat min(const quat &a, const quat &b);          -- min(q1, q2)    */
  82.   /*friend quat max(const quat &a, const quat &b);          -- max(q1, q2)    */
  83.   friend quat prod(const quat &a, const quat &b);          /* term by term mult*/
  84. }; 
  85. /* Utility functions */
  86. quat quat_identity();        /* Returns quaternion identity element */
  87. quat quat_slerp(const quat &from, const quat &to, float t);
  88. #endif