Advertisement
Guest User

quaternion_rotation.cpp

a guest
Jan 18th, 2014
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.99 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2.  
  3. #include "allegro5/allegro.h"
  4. #include "allegro5/allegro_primitives.h"
  5. #include "math.h"
  6. #include "quat.h"
  7. #include "matrix.h"
  8. #include <iostream>
  9.  
  10. const int SCREEN_X = 800;
  11. const int SCREEN_Y = 600;
  12.  
  13. const float FPS = 10.0f;
  14.  
  15. const int CUBE_LINES = 12;
  16. const int CUBE_VERTS = 8;
  17. // *********************************
  18. typedef float matrix[3][3];
  19. // *********************************
  20. ALLEGRO_DISPLAY *display;
  21. ALLEGRO_EVENT_QUEUE *event_queue;
  22. ALLEGRO_TIMER *timer;
  23.  
  24. struct verts
  25. {
  26.         float vx;
  27.         float vy;
  28.         float vz;
  29. };
  30. // *********************************
  31. struct lines
  32. {
  33.         int start;
  34.         int end;
  35. };
  36. // *********************************
  37. float deg_to_rad(float deg)
  38. {
  39.     return deg * ((float)M_PI / 180.0f);
  40. }
  41.  
  42.  
  43.  
  44. // *********************************
  45. void check_angles(float &x_ang, float &y_ang, float &z_ang)
  46. {
  47.         if(x_ang >= 180.0f)
  48.             x_ang -= 360.0f;
  49.         else if(x_ang < -180.0f)
  50.             x_ang += 360.f;
  51.  
  52.         if(y_ang >= 180.0f)
  53.             y_ang -= 360.0f;
  54.         else if(y_ang < -180.0f)
  55.             y_ang += 360.f;
  56.  
  57.         if(z_ang >= 180.0f)
  58.             z_ang -= 360.0f;
  59.         else if(z_ang < -180.0f)
  60.             z_ang += 360.f;
  61. }
  62. // *********************************
  63. void set_polygon_verts(verts *polygon_verts)
  64. {
  65.         polygon_verts[0].vx = 00.0f;
  66.         polygon_verts[0].vy = 00.0f;
  67.         polygon_verts[0].vz = 00.0f;
  68.  
  69.         polygon_verts[1].vx = -100.0f;
  70.         polygon_verts[1].vy = 100.0f;
  71.         polygon_verts[1].vz = 00.0f;
  72.  
  73.         polygon_verts[2].vx = 100.0f;
  74.         polygon_verts[2].vy = 100.0f;
  75.         polygon_verts[2].vz = 0.0f;
  76. }
  77. void set_polygon_lines(lines *polygon_lines)
  78. {
  79.         polygon_lines[0].start = 0;
  80.         polygon_lines[0].end = 1;
  81.  
  82.         polygon_lines[1].start = 1;
  83.         polygon_lines[1].end = 2;
  84.  
  85.         polygon_lines[2].start = 2;
  86.         polygon_lines[2].end = 0;
  87. }
  88. // *********************************
  89. CVec3 RotatePoint( float t, CVec3 P1,
  90.                   float angle_i, float angle_f,
  91.                   int x1, int y1, int z1
  92.                   , int x2, int y2, int z2)
  93. {
  94.     CQuat QRot;
  95.     CQuat Q1( angle_i, CVec3( x1, y1, z1)); // Set by axis-angle
  96.     CQuat Q2( angle_f, CVec3( x2, y2, z2));
  97.     //QRot.Slerp( Q1, Q2, t, false);
  98.     QRot.QuaternionSlerp( Q1, Q2, t);
  99.  
  100.     CMatrix M;
  101.     QRot.ToMatrix( M.mf);
  102.     return M*P1;
  103. }
  104. void calc_quaternion_verts( verts *c_verts, verts *s_verts,
  105.                                     int vertices_count, float t,
  106.                                     float angle_i, float angle_f,
  107.                                     int x1, int y1, int z1,
  108.                                     int x2, int y2, int z2)
  109. {
  110.         CVec3 P1;
  111.         float new_x = 0.0f;
  112.         float new_y = 0.0f;
  113.         float new_z = 0.0f;
  114.         float x_center = (float)SCREEN_X / 2.0f;
  115.         float y_center = (float)SCREEN_Y / 2.0f;
  116.  
  117.         for( int i = 0; i < vertices_count; i++)
  118.         {
  119.             P1.x = c_verts[i].vx;
  120.             P1.y = c_verts[i].vy;
  121.             P1.z = c_verts[i].vz;
  122.  
  123.             //P1 = RotatePoint( t, P1, angle_i, angle_f, x1, 0.0f, 0.0f, x2, 0.0f, 0.0f);
  124.             //P1 = RotatePoint( t, P1, angle_i, angle_f, 0.0f, y1, 0.0f, 0.0f, y2, 0.0f);
  125.             //P1 = RotatePoint( t, P1, angle_i, angle_f, 0.0f, 0.0f, z1, 0.0f, 0.0f, z2);
  126.             P1 = RotatePoint( t, P1, angle_i, angle_f, x1, y1, z1, x2, y2, z2);
  127.  
  128.             new_x = P1.x;
  129.             new_y = P1.y;
  130.             new_z = P1.z;
  131.  
  132.             s_verts[i].vx = new_x + x_center;
  133.             s_verts[i].vy = new_y + y_center;
  134.             s_verts[i].vz = new_z;
  135.         }
  136. }
  137. // *********************************
  138. void Draw_Shape(verts *s_verts, lines *c_lines, int lines_count)
  139. {
  140.         int i;
  141.         for(i = 0; i < lines_count; i++)
  142.         {
  143.             al_draw_line(
  144.                          s_verts[c_lines[i].start].vx,
  145.                          s_verts[c_lines[i].start].vy,
  146.                          s_verts[c_lines[i].end].vx,
  147.                          s_verts[c_lines[i].end].vy,
  148.                          al_map_rgb(0,255,0), 0
  149.                          );
  150.         }
  151. }
  152. // *********************************
  153. void allegro_initialization()
  154. {
  155.         display = NULL;
  156.         event_queue = NULL;
  157.         timer = NULL;
  158.  
  159.         al_init();
  160.         al_init_primitives_addon();
  161.  
  162.         al_set_new_display_option(ALLEGRO_VSYNC, 1, ALLEGRO_SUGGEST);
  163.         display = al_create_display(SCREEN_X, SCREEN_Y);
  164.         event_queue = al_create_event_queue();
  165.         timer = al_create_timer(1.0f / FPS);
  166.  
  167.         al_register_event_source(event_queue, al_get_display_event_source(display));
  168.         al_register_event_source(event_queue, al_get_timer_event_source(timer));
  169.  
  170.         al_start_timer(timer);
  171. }
  172. void swap( float &temp1, float &temp2)
  173. {
  174.     std::cout<<"swapping angles"<<std::endl;
  175.         float temp3 = temp1;
  176.         temp1 = temp2;
  177.         temp2 = temp3;
  178. }
  179. int main(int argc, char *argv[])
  180. {
  181.         allegro_initialization();
  182.         bool loop = true;
  183.         bool draw = false;
  184.         verts qpolygon_verts[3];
  185.         set_polygon_verts(qpolygon_verts);
  186.         verts qpolygon_screen_verts[3];
  187.         lines qpolygon_lines[3];
  188.         set_polygon_lines(qpolygon_lines);
  189.  
  190.         float t = 0.0f;
  191.         float angle_i, angle_f, x1, y1, z1, x2, y2, z2;
  192.  
  193.         angle_i = 0.0f;
  194.         angle_f = 180.0f;
  195.         x1 = 1.0f;
  196.         x2 = -1.0f;
  197.         y1 = 1.0f;
  198.         y2 = -1.0f;
  199.         z1 = 1.0f;
  200.         z2 = -1.0f;
  201.  
  202.         while(loop)
  203.         {
  204.             ALLEGRO_EVENT event;
  205.             al_wait_for_event(event_queue, &event);
  206.  
  207.             switch(event.type)
  208.             {
  209.                 case ALLEGRO_EVENT_DISPLAY_CLOSE:
  210.                     loop = false;
  211.                     break;
  212.                 case ALLEGRO_EVENT_TIMER:
  213.                     draw = true;
  214.                     break;
  215.                 default:
  216.                     break;
  217.             }
  218.             if(draw && al_event_queue_is_empty(event_queue))
  219.             {
  220.                 draw = false;
  221.                 al_clear_to_color(al_map_rgb(0,0,25));
  222.                 calc_quaternion_verts( qpolygon_verts, qpolygon_screen_verts, 3, t, angle_i, angle_f, x1, y1, z1, x2, y2, z2);
  223.                 Draw_Shape(qpolygon_screen_verts, qpolygon_lines, 3);
  224.                 al_flip_display();
  225.  
  226.                 t += .01;
  227.                 if(t > 1)
  228.                 {
  229.                     t = 0;
  230.                     swap(angle_i, angle_f);//this makes sure that the polygon rotates 360 degrees by flipping the signs and swapping
  231.                     //the angles.
  232.                     x2*= -1;
  233.                     y2*= -1;
  234.                     z2*= -1;
  235.                 }
  236.             }
  237.         }
  238.  
  239.         al_stop_timer(timer);
  240.         al_flush_event_queue(event_queue);
  241.         al_destroy_event_queue(event_queue);
  242.         al_destroy_timer(timer);
  243.         al_destroy_display(display);
  244.  
  245.         return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement