1. -- 
  2. -- Jan & Uwe R. Zimmer, Australia, July 2011 
  3. -- 
  4.  
  5. with Float_Type;  use Float_Type; 
  6. with Quaternions; use Quaternions; 
  7. with Vectors_3D;  use Vectors_3D; 
  8. with Matrices; 
  9.  
  10. package Rotations is 
  11.  
  12.    pragma Elaborate_Body (Rotations); 
  13.  
  14.    package Matrices_3D         is new Matrices    (Dimension => 3); 
  15.    package Matrices_4D         is new Matrices    (Dimension => 4); 
  16.  
  17.    subtype Vector              is Vector_3D; 
  18.    subtype Quaternion_Rotation is Quaternion_Real; 
  19.    subtype Matrix_3D           is Matrices_3D.Matrix; 
  20.    subtype Matrix_4D           is Matrices_4D.Matrix; 
  21.  
  22.    subtype Radiants            is Real; 
  23.    subtype Degrees             is Real; 
  24.  
  25.    function To_Radiants (A : Degrees)  return Radiants; 
  26.    function To_Degrees  (A : Radiants) return Degrees; 
  27.  
  28.    type Rotation_Order is (RPY, RYP, PRY, PYR, YRP, YPR); 
  29.  
  30.    Roll_Axis  : constant Vector := (x => 1.0, y => 0.0, z => 0.0); 
  31.    Pitch_Axis : constant Vector := (x => 0.0, y => 0.0, z => 1.0); 
  32.    Yaw_Axis   : constant Vector := (x => 0.0, y => 1.0, z => 0.0); 
  33.  
  34.    function To_Rotation (Axis : Vector;      Rotation_Angle : Radiants) return Quaternion_Rotation; 
  35.    function To_Rotation (Roll_Angle, Pitch_Angle, Yaw_Angle : Radiants) return Quaternion_Rotation; 
  36.    function To_Rotation (Matrix : Matrix_3D)                         return Quaternion_Rotation; 
  37.    function To_Rotation (Matrix : Matrix_4D)                         return Quaternion_Rotation; 
  38.  
  39.    function Zero_Rotation return Quaternion_Rotation; 
  40.  
  41.    function Inverse (Quad : Quaternion_Rotation) return Quaternion_Rotation; 
  42.  
  43.    function Rotate (Current_Rotation, Additional_Rotation : Quaternion_Rotation)                            return Quaternion_Rotation; 
  44.    function Rotate (Current_Rotation : Quaternion_Rotation; Rotation_Axis : Vector; Rotation_Angle : Radiants) return Quaternion_Rotation; 
  45.  
  46.    function Rotate (Current_Vector, Rotation_Axis : Vector; Rotation_Angle : Radiants) return Vector; 
  47.    function Rotate (Current_Vector : Vector; Apply_Rotation : Quaternion_Rotation)  return Vector; 
  48.  
  49.    function Roll  (Quad : Quaternion_Rotation) return Radiants; 
  50.    function Pitch (Quad : Quaternion_Rotation) return Radiants; 
  51.    function Yaw   (Quad : Quaternion_Rotation) return Radiants; 
  52.  
  53.    function Roll  (Matrix : Matrix_3D) return Radiants; 
  54.    function Pitch (Matrix : Matrix_3D) return Radiants; 
  55.    function Yaw   (Matrix : Matrix_3D) return Radiants; 
  56.  
  57.    function To_Matrix_3D        (Quad : Quaternion_Rotation) return Matrix_3D; 
  58.    function To_Matrix_3D_OpenGL (Quad : Quaternion_Rotation) return Matrix_3D; 
  59.    function To_Matrix_4D        (Quad : Quaternion_Rotation) return Matrix_4D; 
  60.  
  61.    function To_Matrix_3D        (Roll_Angle, Pitch_Angle, Yaw_Angle : Radiants) return Matrix_3D; 
  62.    function To_Matrix_3D_OpenGL (Roll_Angle, Pitch_Angle, Yaw_Angle : Radiants; 
  63.                                  Order        : Rotation_Order := RPY; 
  64.                                  Column_First : Boolean        := True) return Matrix_3D; 
  65.  
  66. end Rotations;