opengl 机器人手臂
2015-06-03 23:17
399 查看
#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); //glLoadIdentity(); glPushMatrix();//保存的是单位矩阵 glTranslatef (-1.0, 0.0, 0.0);//可以理解为绕着z=-1在转 glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0); glRotatef ((GLfloat) elbow, 0.0, 1.0, 1.0); glTranslatef (1.0, 0.0, 0.0);//可以理解为坐标又回到了原点 glPushMatrix();//讲这个原点坐标保存起来 glScalef (2.0, 0.4, 0.4);//x轴扩大了两倍, glutWireCube (1.0);//以原点为中心画一个正方体 glPopMatrix(); glPushMatrix();//再次恢复上一次的坐标, glTranslatef (1.0, 0.12, 0.0); glRotatef ((GLfloat) elbow, 0.0, 1.0, 0.0); glTranslatef (0.55, 0.0, 0.0); glPushMatrix(); glScalef (1.0, 0.2, 0.2); //glScalef (2.0, 0.4, 1.0); glutWireCube (1.0); glPopMatrix(); glTranslatef (0.55, 0.0, 0.0);//使用第二节手臂的局部坐标 glRotatef ((GLfloat) elbow, 0.0, 1.0, 0.0); glTranslatef (0.30, 0.0, 0.0); glScalef (0.5, 0.1, 0.1); glutWireCube (1.0); glPopMatrix();//再次恢复第一节手臂的局部坐标 glTranslatef (1.0, -0.12, 0.0); glRotatef ((GLfloat) elbow, 0.0, 1.0, 0.0); glTranslatef (0.55, 0.0, 0.0); glPushMatrix(); glScalef (1.0, 0.2, 0.2); glutWireCube (1.0); glPopMatrix(); glTranslatef (0.55, 0.0, 0.0);//采用第二节手臂的局部坐标 glRotatef ((GLfloat) elbow, 0.0, 1.0, 0.0); glTranslatef (0.30, 0.0, 0.0); glScalef (0.5, 0.1, 0.1); glutWireCube (1.0); glPopMatrix(); glutSwapBuffers(); // glFlush (); } 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) { static int angle=5; switch (key) { case 's': shoulder = (shoulder + 5) % 360; glutPostRedisplay(); break; case 'S': shoulder = (shoulder - 5) % 360; glutPostRedisplay(); break; case 'e': //elbow = (elbow + 5) % 360; if(elbow>=90&&angle>0){ angle=-angle; } if(elbow<0&&angle<0){ angle=-angle; } printf("%d,%d\n",elbow,angle); elbow = (elbow + angle); printf("%d\n",elbow); 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; }
相关文章推荐
- linux中的vi命令
- Linux引导流程解析(3)
- logresolve - 解析Apache日志中的IP地址为主机名
- Linux下编译安装PCRE库
- 安装 Kali Linux 后需要做的 20 件事
- linux下使用sublime-text写coffee遇到的编译问题
- Centos安装mysql,失败又失败····
- Unix/Linux下的动态库和静态库、动态加载共享库
- linux命令详解——tee
- linux命令详解——tee
- Linux下安装Tomcat服务器和部署Web应用
- 用SecureCRT在windows和CentOS间上传下载文件
- 正向代理与反向代理的区别
- Kali Linux安装360免费wifi驱动。
- 【linux】文字提取
- 使用PowerShell收集客户端MAC地址
- 添加docker权限给当前用户,使docker命令免sudo
- linux命令---查找文件中的内容
- Openwrt iptables分析
- SDCC Linux编译