您的位置:首页 > 运维架构

OpenGL 模拟机械手臂简单示例

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

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



其中,

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

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

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

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

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

具体代码如下:

#include <GL/glut.h>

#include <stdlib.h>

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opengl