OpenGL 模拟机械手臂简单示例

  本文模拟了一个非常简单的机器人手臂程序,具体的细节可以参照《OpenGL 编程指南》(Dava Shreiner 著)。

此手臂分为两段,手臂在肩肘或其他关节处用节点进行连接。简单的模型如下图所示。


OpenGL 模拟机械手臂简单示例_第1张图片

其中,

1)按下"s“键,肩膀长方体可以绕肩关节逆时针旋转

2)按下”S“键,肩膀长方体可以绕肩关节顺时针旋转

3)按下”e“键,手臂长方体可以绕肩关节逆时针旋转

4)按下”E“键,手臂长方体可以绕肩关节顺时针旋转


代码学习时,关键点在于怎样通过坐标变换,让相应的长方体围绕不同的点就行旋转

具体代码如下:

#include
#include


static int shoulder = 0, elbow = 0;


void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
}


void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glPushMatrix();
   glTranslatef (-1.0, 0.0, 0.0);
   glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
   glTranslatef (1.0, 0.0, 0.0);
   glPushMatrix();
   glScalef (2.0, 0.4, 1.0);
   glColor3f(1.0,0.0,0.0);
   glutSolidCube(1.0);
   glPopMatrix();


   glTranslatef (1.0, 0.0, 0.0);
   glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
   glTranslatef (1.0, 0.0, 0.0);
   glPushMatrix();
   glScalef (2.0, 0.4, 1.0);
   glColor3f(0.0,0.0,1.0);
   glutSolidCube(1.0);
   glPopMatrix();


   glPopMatrix();
   glutSwapBuffers();
}


void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef (0.0, 0.0, -5.0);
}


void keyboard (unsigned char key, int x, int y)
{
   switch (key) {
      case 's':
         shoulder = (shoulder + 5) % 360;
         glutPostRedisplay();
         break;
      case 'S':
         shoulder = (shoulder - 5) % 360;
         glutPostRedisplay();
         break;
      case 'e':
         elbow = (elbow + 5) % 360;
         glutPostRedisplay();
         break;
      case 'E':
         elbow = (elbow - 5) % 360;
         glutPostRedisplay();
         break;
      case 27:
         exit(0);
         break;
      default:
         break;
   }
}


int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}

你可能感兴趣的:(计算机图形学Graphics,opengl)