demoII5_4.cpp
上传用户:husern
上传日期:2018-01-20
资源大小:42486k
文件大小:9k
源码类别:

游戏

开发平台:

Visual C++

  1. // DEMOII5_4.CPP - Quaternion lab
  2. // INCLUDES ///////////////////////////////////////////////////
  3. #define WIN32_LEAN_AND_MEAN  
  4. #ifndef INITGUID
  5. #define INITGUID       // you need this or DXGUID.LIB
  6. #endif
  7. #include <windows.h>   // include important windows stuff
  8. #include <windowsx.h> 
  9. #include <mmsystem.h>
  10. #include <objbase.h>
  11. #include <iostream.h> // include important C/C++ stuff
  12. #include <conio.h>
  13. #include <stdlib.h>
  14. #include <malloc.h>
  15. #include <memory.h>
  16. #include <string.h>
  17. #include <stdarg.h>
  18. #include <stdio.h>
  19. #include <math.h>
  20. #include <io.h>
  21. #include <fcntl.h>
  22. #include <direct.h>
  23. #include <wchar.h>
  24. #include <ddraw.h>      // needed for defs in T3DLIB1.H 
  25. #include "T3DLIB1.H"    // T3DLIB4 is based on some defs in this 
  26. #include "T3DLIB4.H"
  27. // DEFINES ////////////////////////////////////////////////////
  28. // TYPES //////////////////////////////////////////////////////
  29. // CLASSES ////////////////////////////////////////////////////
  30. // GLOBALS ////////////////////////////////////////////////////
  31. // define vars expected by graphics engine to compile
  32. HWND main_window_handle;
  33. // FUNCTIONS //////////////////////////////////////////////////
  34. void main()
  35. {
  36. QUAT     q1={0,0,0,0}, 
  37.          q1tmp={0,0,0,}, 
  38.          q2={0,0,0,0}, 
  39.          q2tmp={0,0,0,}, 
  40.          qtmp={0,0,0,},  
  41.          qv={0,0,0,}; // our working quaterions
  42. VECTOR3D v={0,0,0}, vtmp;   // working vectors
  43. POINT3D  p={0,0,0}, ptmp;   // working points
  44. float theta;                // general angle
  45. // open the error system, so we can see output
  46. // notice the last parameter "stdout" this tell the error
  47. // system that we don't want to write errors to a text file
  48. // but straight out to the screen!
  49. Open_Error_File("", stdout);
  50. printf("nQuaternion Lab");
  51. printf("nNote: the lab uses a number of variables to perform various operations");
  52. printf("nThey are quaterions q1,q2, and qtmp, along with the vector v.");
  53. printf("nMany operations will be stored in the temporary quaternion qtmpn");
  54. int sel;    // user selection
  55. int done=0; // exit flag
  56. // main loop
  57. while(!done)
  58. {
  59. // draw menu
  60. printf("nQuaternion Lab Menu - (c) Alien Programmers Inc. - We're ready to invade you!");
  61. printf("n(1) Enter q1 in general format:  w1,x1,y1,z1?");
  62. printf("n(2) Enter in rotation quaterion and store in q1");
  63. printf("n(3) Enter q2 in general format:  w1,x1,y1,z1?");
  64. printf("n(4) Enter vector v in format:  x,y,z?");
  65. printf("n(5) Print q1");
  66. printf("n(6) Print q2");
  67. printf("n(7) Print qtmp");
  68. printf("n(8) Print v");
  69. printf("n(9) Add q1+q2, note result is stored in qtmp");
  70. printf("n(10) Subtract q1-q2, note result is stored in qtmp");
  71. printf("n(11) Normalize q1 (note alters q1)");
  72. printf("n(12) Normalize q2 (note alters q1)");
  73. printf("n(13) Compute conjugate of q1, note result is stored in qtmp");
  74. printf("n(14) Compute conjugate of q2, note result is stored in qtmp");
  75. printf("n(15) Compute inverse of q1, note result is stored in qtmp");
  76. printf("n(16) Compute inverse of q2, note result is stored in qtmp");
  77. printf("n(17) Multiply q1*q2, note result is stored in qtmp");
  78. printf("n(18) Multiply q2*q1, note result is stored in qtmp");
  79. printf("n(19) Compute triple product q1*vector*q1(-1) and store in qtmp, ");
  80. printf("nthis will rotate v assuming q1 is a unit rotation quaterion");
  81. printf("n(20) Clear All");
  82. printf("n(21) Exit");
  83. printf("nMake Selection and Press Enter?");
  84. scanf("%d",&sel);
  85. // what to do?
  86. switch(sel)
  87.       {
  88.         case 1: // printf("n(1) Enter q1 in general format:  w1,x1,y1,z1?");
  89.         {
  90.         printf("nEnter q1 in general format:  w1,x1,y1,z1?");
  91.         scanf("%f, %f, %f, %f", &q1.w, &q1.x, &q1.y, &q1.z);
  92.     
  93.         } break;
  94.         case 2: // printf("n(2) Enter in rotation quaterion and store in q1");
  95.         {
  96.         printf("nEnter in direction vector v you wish to rotate about in form: x,y,z");
  97.         printf("n(system will normalize, so it need not have unit length)?");
  98.         scanf("%f, %f, %f", &vtmp.x, &vtmp.y, &vtmp.z);
  99.         printf("nEnter in angle of rotation in degrees (0-360)?");
  100.         scanf("%f",&theta);
  101.         printf("nGenerating rotation quaterion %f degree around vector (%f, %f, %f)...", 
  102.                 theta, vtmp.x, vtmp.y, vtmp.z);
  103.         // normalize v
  104.         VECTOR3D_Normalize(&vtmp);
  105.         
  106.         // compute quaterion
  107.         VECTOR3D_Theta_To_QUAT(&q1, &vtmp, DEG_TO_RAD(theta));         
  108.         QUAT_Print(&q1,"q1 in rotation format");
  109.         } break;
  110.         case 3: // printf("n(3) Enter q2 in general format:  w1,x1,y1,z1?");
  111.         {
  112.         printf("nEnter q2 in general format:  w1,x1,y1,z1?");
  113.         scanf("%f, %f, %f, %f", &q2.w, &q2.x, &q2.y, &q2.z);
  114.         } break;
  115.         case 4: // printf("n(4) Enter vector v in format:  x,y,z?");
  116.         {
  117.         printf("nEnter vector v in format:  x,y,z?");
  118.         scanf("%f, %f, %f", &v.x, &v.y, &v.z);
  119.         } break;
  120.         case 5: // printf("n(5) Print q1");
  121.         {
  122.         QUAT_Print(&q1,"q1");
  123.         } break;
  124.         case 6: // printf("n(6) Print q2");
  125.         {
  126.         QUAT_Print(&q2,"q2");
  127.         } break;
  128.         case 7: // printf("n(7) Print qtmp");
  129.         {
  130.         QUAT_Print(&qtmp,"qtmp");
  131.         } break;
  132.         case 8: // printf("n(8) Print v");
  133.         {
  134.         VECTOR3D_Print(&v,"v");
  135.         } break;
  136.         case 9: // printf("n(9) Add q1+q2, note result is stored in qtmp");
  137.         {
  138.         QUAT_Add(&q1, &q2, &qtmp);
  139.         QUAT_Print(&qtmp,"qtmp=q1+q2");
  140.         } break;
  141.         case 10: // printf("n(10) Subtract q1-q2, note result is stored in qtmp");
  142.         {
  143.         QUAT_Sub(&q1, &q2, &qtmp);
  144.         QUAT_Print(&qtmp,"qtmp=q1-q2");
  145.         } break;
  146.         case 11: // printf("n(11) Normalize q1 (note alters q1)");
  147.         {
  148.         QUAT_Normalize(&q1);
  149.         QUAT_Print(&q1,"q1");
  150.         } break;
  151.         case 12: // printf("n(12) Normalize q2 (note alters q1)");
  152.         {
  153.         QUAT_Normalize(&q1);
  154.         QUAT_Print(&q1,"q1");
  155.         } break;
  156.         case 13: // printf("n(13) Compute conjugate of q1, note result is stored in qtmp");
  157.         {
  158.         QUAT_Conjugate(&q1, &qtmp);
  159.         QUAT_Print(&qtmp,"qtmp = q1*");
  160.         } break;
  161.         case 14: // printf("n(14) Compute conjugate of q2, note result is stored in qtmp");
  162.         {
  163.         QUAT_Conjugate(&q2, &qtmp);
  164.         QUAT_Print(&qtmp,"qtmp = q2*");
  165.         } break;
  166.         case 15: // printf("n(15) Compute inverse of q1, note result is stored in qtmp");
  167.         {
  168.         QUAT_Inverse(&q1, &qtmp);
  169.         QUAT_Print(&qtmp,"qtmp = q1(-1)");
  170.         } break;
  171.         case 16: // printf("n(16) Compute inverse of q2, note result is stored in qtmp");
  172.         {
  173.         QUAT_Inverse(&q2, &qtmp);
  174.         QUAT_Print(&qtmp,"qtmp = q2(-1)");
  175.         } break;
  176.         case 17: // printf("n(17) Multiply q1*q2, note result is stored in qtmp");
  177.         {
  178.         QUAT_Mul(&q1, &q2, &qtmp);
  179.         QUAT_Print(&qtmp,"qtmp=q1 * q2");
  180.         } break;
  181.         case 18: // printf("n(18) Multiply q2*q1, note result is stored in qtmp");
  182.         {
  183.         QUAT_Mul(&q2, &q1, &qtmp);
  184.         QUAT_Print(&qtmp,"qtmp=q2 * q1");
  185.         } break;
  186.         case 19: // printf("n(19) Compute triple product q1*vector*q1(-1) and store in qtmp, 
  187.                  // this will rotate v assuming q1 is a unit rotation quaterion");
  188.         {
  189.         printf("nComputing triple product...note q1 will be normalized if length <> 1");
  190.         QUAT_Normalize(&q1);
  191.         printf("nAssuming q1 represents rotation quaternion, value is:");
  192.         QUAT_Print(&q1,"q1");
  193.         
  194.         printf("nVector v represent point or vector to be rotated, value is:");
  195.         VECTOR3D_Print(&v,"v");
  196.         printf("nv after conversion to quaternion format is:");
  197.  
  198.         // vector must be converted to a quaternion
  199.         QUAT_INIT_VECTOR3D(&qv, &v);
  200.         QUAT_Print(&qv,"qv"); 
  201.         // now perform triple product, but conjugate = inverse for unit quaterions
  202.         // so all we need for inverse is to compute conjugate of q1
  203.         QUAT_Conjugate(&q1, &q1tmp);
  204.         // now perform triple multiply q1 * v(in q format) * q1(-1)
  205.         // this will rotate v
  206.         QUAT_Triple_Product(&q1, &qv, &q1tmp, &qtmp);
  207.   
  208.         printf("nResulting quaternion after multiplication is v rotated which equals:");
  209.         QUAT_Print(&qtmp,"v rotated in quaternion format");
  210.         } break;
  211.         case 20: // printf("n(20) Clear All");
  212.         {
  213.         // simply clear all values
  214.         VECTOR3D_ZERO(&v);
  215.         QUAT_ZERO(&q1);
  216.         QUAT_ZERO(&q2);
  217.         QUAT_ZERO(&qtmp);
  218.         } break;
  219.         case 21: // printf("n(21) Exit");
  220.         {
  221.         // set exit flag
  222.         done=1;
  223.         } break;
  224.       default: break;
  225.       } // end switch
  226. printf("nPress Spacebar to continue...");
  227. getch();
  228. } // end while
  229. // close error system
  230. Close_Error_File();
  231. } // end main