opengl学习(五)一个机械臂程序,有关模型转换

来源:互联网 发布:大数据介绍 编辑:程序博客网 时间:2024/05/20 21:44
最近这个内容让我很窝火啊,真是有点摸不到头脑,经过查资料,终于知道这其中的一些原理,由于我现在只是初步学习,有关矩阵变换的问题,我会在后面补充的,目前先稍微的说明,看了一个机械臂的程序,研究好一段时间终于知道模型变换中的这两个函数glTranslatef(),glRotatef()在执行的顺序上与实际是相反的。
 

参看http://www.cnblogs.com/yujunyong/archive/2011/04/17/2018776.html,这里面讲述了顺序的问题

看一下这个机械臂的程序中有关这两个函数的应用

  1.  glClear(GL_COLOR_BUFFER_BIT);  
  2.   
  3.    glPushMatrix();  
  4.    glColor3f(0.0, 1.0, 1.0);  
  5. glTranslatef (-0.5, 0.0, 0.0);  
  6. glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);  
  7.    glTranslatef (1.0, 0.0, 0.0);  
  8.    auxSolidBox(2.0, 0.3, 0.5);  


 

这两个操作是画两个正方体,并且旋转方式都是按Z轴逆时针旋转,按照上面所阐述的内容,首先是先移动坐标轴,然后在绕Z旋转操作,先移动后旋转,物体旋转时是以(0.0f,0.0f,0.0f)这个点绕Z轴逆时针旋转的(旋转是右手坐标系),然后再调用glTranslatef(-0.5,0.0,0.0),这个操作实际上是改变了原点,也就是再旋转时是以原坐标经(-0.5,0.0,0.0)变换后的那个点绕Z轴旋转的,然后绘制立方体
下一步是画第2个立方体,我设置成蓝色的以便好观察

代码如下

  1.  glColor3f(0.0, 0.0, 1.0);   
  2.       
  3.  glTranslatef (1.0, 0.0, 0.0);  
  4. glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);  
  5. glTranslatef (0.8, 0.0, 0.0);  
  6.     auxSolidBox(1.6, 0.2, 0.5);  


同样的操作,是先移动后旋转,然后改变原点的位置,使其旋转。
 
效果如下

全部代码如下

  1. #include <windows.h>  
  2.    
  3. #include <GL/gl.h>  
  4. #include <GL/glu.h>  
  5. #include <GL/glaux.h>  
  6. #pragma comment(lib,"openGL32.lib")  
  7. #pragma   comment(lib, "glu32.lib")  
  8. #pragma   comment(lib, "glaux.lib")  
  9.   
  10. void myinit(void);  
  11. void drawPlane(void);  
  12. void CALLBACK elbowAdd (void);  
  13. void CALLBACK elbowSubtract (void);  
  14. void CALLBACK shoulderAdd (void);  
  15. void CALLBACK shoulderSubtract (void);  
  16. void CALLBACK fingerAdd (void);  
  17. void CALLBACK fingerSubtract(void);  
  18. void CALLBACK finger1Add (void);  
  19. void CALLBACK finger1Subtract(void);  
  20. void CALLBACK finger2Add (void);  
  21. void CALLBACK finger2Subtract(void);  
  22. void CALLBACK finger3Add (void);  
  23. void CALLBACK finger3Subtract(void);  
  24. void CALLBACK finger4Add (void);  
  25. void CALLBACK finger4Subtract(void);  
  26. void CALLBACK finger5Add (void);  
  27. void CALLBACK finger5Subtract(void);  
  28. void CALLBACK finger6Add (void);  
  29. void CALLBACK finger6Subtract(void);  
  30. void CALLBACK display(void);  
  31. void CALLBACK myReshape(GLsizei w, GLsizei h);  
  32.    
  33. static int shoulder = 0, elbow = 0,finger = 0,finger1=0,finger2=0,finger3=0,finger4=0,finger5=0,finger6=0;  
  34.    
  35. void CALLBACK elbowAdd (void)  
  36. {elbow = (elbow + 5) % 360;}  
  37.    
  38. void CALLBACK elbowSubtract (void)  
  39. {elbow = (elbow - 5) % 360;}  
  40.    
  41. void CALLBACK shoulderAdd (void)  
  42. { shoulder = (shoulder + 5) % 360;}  
  43. void CALLBACK shoulderSubtract (void)  
  44. { shoulder = (shoulder - 5) % 360;}  
  45. void CALLBACK fingerAdd (void)  
  46. { finger = (finger + 5) % 360;}  
  47.    
  48. void CALLBACK fingerSubtract(void)  
  49. { finger = (finger - 5) % 360;}  
  50. void CALLBACK finger1Add (void)  
  51. { finger1 = (finger1 + 5) % 360;}  
  52.    
  53. void CALLBACK finger1Subtract(void)  
  54. { finger1 = (finger1 - 5) % 360;}  
  55. void CALLBACK finger2Add (void)  
  56. { finger2 = (finger2 + 5) % 360;}  
  57.    
  58. void CALLBACK finger2Subtract(void)  
  59. { finger2 = (finger2 - 5) % 360;}  
  60. void CALLBACK finger3Add (void)  
  61. { finger3 = (finger3 + 5) % 360;}  
  62.    
  63. void CALLBACK finger3Subtract(void)  
  64. {finger3 = (finger3 - 5) % 360;}  
  65. void CALLBACK finger4Add (void)  
  66. { finger4 = (finger4 + 5) % 360;}  
  67.    
  68. void CALLBACK finger4Subtract(void)  
  69. {finger4 = (finger4 - 5) % 360;}  
  70. void CALLBACK finger5Add (void)  
  71. { finger5 = (finger5 + 5) % 360;}  
  72.    
  73. void CALLBACK finger5Subtract(void)  
  74. { finger5 = (finger5 - 5) % 360;}  
  75. void CALLBACK finger6Add (void)  
  76. { finger6 = (finger6 + 5) % 360;}  
  77.    
  78. void CALLBACK finger6Subtract(void)  
  79. { finger6 = (finger6 - 5) % 360;}  
  80.    
  81.   
  82. void CALLBACK display(void)  
  83. {  
  84.    
  85.     glClear(GL_COLOR_BUFFER_BIT);  
  86.    
  87.     glPushMatrix();  
  88.     glColor3f(0.0, 1.0, 1.0);  
  89.     glTranslatef (-0.5, 0.0, 0.0);  
  90.     glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);  
  91.     glTranslatef (1.0, 0.0, 0.0);  
  92.     auxSolidBox(2.0, 0.3, 0.5);  
  93.    
  94.  glColor3f(0.0, 0.0, 1.0);   
  95.       
  96.  glTranslatef (1.0, 0.0, 0.0);  
  97. glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);  
  98. glTranslatef (0.8, 0.0, 0.0);  
  99.     auxSolidBox(1.6, 0.2, 0.5);  
  100.       
  101.   glPushMatrix();  
  102.   glColor3f(0.0, 1.0, 1.0);  
  103.  glTranslatef (0.8, 0.0, 0.0);  
  104.     glRotatef ((GLfloat) finger, 0.0, 0.0, 1.0);  
  105.     glTranslatef (0.295, 0.0, 0.1);  
  106.     auxWireBox(0.5, 0.1, 0.2);  
  107.   
  108.  glColor3f(0.0, 1.0, 1.0);      
  109.  glTranslatef (0.2, 0.0, 0.0);  
  110.    glRotatef ((GLfloat) finger1, 0.0, 0.0, 1.0);  
  111.     glTranslatef (0.295, 0.0, 0.0);  
  112.     auxWireBox(0.4, 0.1, 0.2);  
  113.       
  114. glPopMatrix();   
  115.  glPushMatrix();  
  116.   
  117.  glColor3f(0.0, 1.0, 1.0);  
  118.  glTranslatef (0.8, 0.0, 0.0);  
  119.     glRotatef ((GLfloat) finger2, 0.0, 0.0, 1.0);  
  120.     glTranslatef (0.295, 0.0, 0.1);  
  121.     auxWireBox(0.5, 0.1, 0.2);  
  122.   
  123.  glColor3f(0.0, 1.0, 1.0);      
  124.  glTranslatef (0.2, 0.0, 0.0);  
  125.     glRotatef ((GLfloat) finger3, 0.0, 0.0, 1.0);  
  126.     glTranslatef (0.295, 0.0, 0.0);  
  127.     auxWireBox(0.4, 0.1, 0.2);  
  128.       
  129.  glPopMatrix();  
  130.    
  131.  glPushMatrix();  
  132.   
  133.  glColor3f(0.0, 1.0, 1.0);  
  134.  glTranslatef (0.8, 0.0, 0.0);  
  135.     glRotatef ((GLfloat) finger4, 0.0, 0.0, 1.0);  
  136.     glTranslatef (0.295, 0.0, 0.1);  
  137.     auxWireBox(0.5, 0.1, 0.2);  
  138.   
  139.  glColor3f(0.0, 1.0, 1.0);      
  140.  glTranslatef (0.2, 0.0, 0.0);  
  141.     glRotatef ((GLfloat) finger5, 0.0, 0.0, 1.0);  
  142.     glTranslatef (0.295, 0.0, 0.0);  
  143.     auxWireBox(0.4, 0.1, 0.2);  
  144.       
  145.  glPopMatrix();  
  146.  glPushMatrix();  
  147.   
  148.  glColor3f(0.0, 0.0, 1.0);  
  149.  glTranslatef (0.8, 0.0, 0.0);  
  150.     glRotatef ((GLfloat) finger6, 0.0, 0.0, 1.0);  
  151.     glTranslatef (0.295, 0.0, 0.1);  
  152.     auxWireBox(0.7, 0.1, 0.2);  
  153.       
  154.  glPopMatrix();  
  155.  glPopMatrix();  
  156.     glFlush();  
  157. }  
  158.    
  159. void myinit (void)  
  160. {  
  161.     glShadeModel (GL_FLAT);  
  162. }  
  163.    
  164. void CALLBACK myReshape(GLsizei w, GLsizei h)  
  165. {  
  166.     glViewport(0, 0, w, h);  
  167.     glMatrixMode(GL_PROJECTION);  
  168.     glLoadIdentity();  
  169.     gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);  
  170.     glMatrixMode(GL_MODELVIEW);  
  171.     glLoadIdentity();  
  172.     glTranslatef (0.0, 0.0, -5.0);  /* viewing transform  */  
  173. }  
  174.    
  175.    
  176. void main(void)  
  177. {  
  178.     auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);  
  179.     auxInitPosition (0, 0, 400, 400);  
  180.     auxInitWindow ("Composite Modeling Transformations");  
  181.    
  182.     myinit ();  
  183.    
  184.     auxKeyFunc (AUX_LEFT, shoulderSubtract);  
  185.     auxKeyFunc (AUX_RIGHT, shoulderAdd);  
  186.     auxKeyFunc (AUX_UP, elbowAdd);  
  187.     auxKeyFunc (AUX_DOWN, elbowSubtract);  
  188.  auxKeyFunc (AUX_w, fingerAdd);  
  189.     auxKeyFunc (AUX_s, fingerSubtract);  
  190.  auxKeyFunc (AUX_a, finger1Add);  
  191.     auxKeyFunc (AUX_d, finger1Subtract);  
  192.  auxKeyFunc (AUX_0, finger2Add);  
  193.     auxKeyFunc (AUX_1, finger2Subtract);  
  194.       
  195.  auxKeyFunc (AUX_2, finger3Add);  
  196.     auxKeyFunc (AUX_3, finger3Subtract);  
  197.  auxKeyFunc (AUX_4, finger4Add);  
  198.     auxKeyFunc (AUX_5, finger4Subtract);  
  199.  auxKeyFunc (AUX_6, finger5Add);  
  200.     auxKeyFunc (AUX_7, finger5Subtract);  
  201.  auxKeyFunc (AUX_8, finger6Add);  
  202.     auxKeyFunc (AUX_9, finger6Subtract);  
  203.   
  204.     auxReshapeFunc (myReshape);  
  205.     auxMainLoop(display);  
  206. }  
0 0
原创粉丝点击