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