opengl学习(五)一个机械臂程序,有关模型转换
来源:互联网 发布:大数据介绍 编辑:程序博客网 时间:2024/05/20 21:44
最近这个内容让我很窝火啊,真是有点摸不到头脑,经过查资料,终于知道这其中的一些原理,由于我现在只是初步学习,有关矩阵变换的问题,我会在后面补充的,目前先稍微的说明,看了一个机械臂的程序,研究好一段时间终于知道模型变换中的这两个函数glTranslatef(),glRotatef()在执行的顺序上与实际是相反的。
参看http://www.cnblogs.com/yujunyong/archive/2011/04/17/2018776.html,这里面讲述了顺序的问题
看一下这个机械臂的程序中有关这两个函数的应用
- glClear(GL_COLOR_BUFFER_BIT);
- glPushMatrix();
- glColor3f(0.0, 1.0, 1.0);
- glTranslatef (-0.5, 0.0, 0.0);
- glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
- glTranslatef (1.0, 0.0, 0.0);
- 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个立方体,我设置成蓝色的以便好观察
代码如下
- glColor3f(0.0, 0.0, 1.0);
- glTranslatef (1.0, 0.0, 0.0);
- glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
- glTranslatef (0.8, 0.0, 0.0);
- auxSolidBox(1.6, 0.2, 0.5);
同样的操作,是先移动后旋转,然后改变原点的位置,使其旋转。
效果如下
全部代码如下
- #include <windows.h>
- #include <GL/gl.h>
- #include <GL/glu.h>
- #include <GL/glaux.h>
- #pragma comment(lib,"openGL32.lib")
- #pragma comment(lib, "glu32.lib")
- #pragma comment(lib, "glaux.lib")
- void myinit(void);
- void drawPlane(void);
- void CALLBACK elbowAdd (void);
- void CALLBACK elbowSubtract (void);
- void CALLBACK shoulderAdd (void);
- void CALLBACK shoulderSubtract (void);
- void CALLBACK fingerAdd (void);
- void CALLBACK fingerSubtract(void);
- void CALLBACK finger1Add (void);
- void CALLBACK finger1Subtract(void);
- void CALLBACK finger2Add (void);
- void CALLBACK finger2Subtract(void);
- void CALLBACK finger3Add (void);
- void CALLBACK finger3Subtract(void);
- void CALLBACK finger4Add (void);
- void CALLBACK finger4Subtract(void);
- void CALLBACK finger5Add (void);
- void CALLBACK finger5Subtract(void);
- void CALLBACK finger6Add (void);
- void CALLBACK finger6Subtract(void);
- void CALLBACK display(void);
- void CALLBACK myReshape(GLsizei w, GLsizei h);
- static int shoulder = 0, elbow = 0,finger = 0,finger1=0,finger2=0,finger3=0,finger4=0,finger5=0,finger6=0;
- void CALLBACK elbowAdd (void)
- {elbow = (elbow + 5) % 360;}
- void CALLBACK elbowSubtract (void)
- {elbow = (elbow - 5) % 360;}
- void CALLBACK shoulderAdd (void)
- { shoulder = (shoulder + 5) % 360;}
- void CALLBACK shoulderSubtract (void)
- { shoulder = (shoulder - 5) % 360;}
- void CALLBACK fingerAdd (void)
- { finger = (finger + 5) % 360;}
- void CALLBACK fingerSubtract(void)
- { finger = (finger - 5) % 360;}
- void CALLBACK finger1Add (void)
- { finger1 = (finger1 + 5) % 360;}
- void CALLBACK finger1Subtract(void)
- { finger1 = (finger1 - 5) % 360;}
- void CALLBACK finger2Add (void)
- { finger2 = (finger2 + 5) % 360;}
- void CALLBACK finger2Subtract(void)
- { finger2 = (finger2 - 5) % 360;}
- void CALLBACK finger3Add (void)
- { finger3 = (finger3 + 5) % 360;}
- void CALLBACK finger3Subtract(void)
- {finger3 = (finger3 - 5) % 360;}
- void CALLBACK finger4Add (void)
- { finger4 = (finger4 + 5) % 360;}
- void CALLBACK finger4Subtract(void)
- {finger4 = (finger4 - 5) % 360;}
- void CALLBACK finger5Add (void)
- { finger5 = (finger5 + 5) % 360;}
- void CALLBACK finger5Subtract(void)
- { finger5 = (finger5 - 5) % 360;}
- void CALLBACK finger6Add (void)
- { finger6 = (finger6 + 5) % 360;}
- void CALLBACK finger6Subtract(void)
- { finger6 = (finger6 - 5) % 360;}
- void CALLBACK display(void)
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glPushMatrix();
- glColor3f(0.0, 1.0, 1.0);
- glTranslatef (-0.5, 0.0, 0.0);
- glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
- glTranslatef (1.0, 0.0, 0.0);
- auxSolidBox(2.0, 0.3, 0.5);
- glColor3f(0.0, 0.0, 1.0);
- glTranslatef (1.0, 0.0, 0.0);
- glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
- glTranslatef (0.8, 0.0, 0.0);
- auxSolidBox(1.6, 0.2, 0.5);
- glPushMatrix();
- glColor3f(0.0, 1.0, 1.0);
- glTranslatef (0.8, 0.0, 0.0);
- glRotatef ((GLfloat) finger, 0.0, 0.0, 1.0);
- glTranslatef (0.295, 0.0, 0.1);
- auxWireBox(0.5, 0.1, 0.2);
- glColor3f(0.0, 1.0, 1.0);
- glTranslatef (0.2, 0.0, 0.0);
- glRotatef ((GLfloat) finger1, 0.0, 0.0, 1.0);
- glTranslatef (0.295, 0.0, 0.0);
- auxWireBox(0.4, 0.1, 0.2);
- glPopMatrix();
- glPushMatrix();
- glColor3f(0.0, 1.0, 1.0);
- glTranslatef (0.8, 0.0, 0.0);
- glRotatef ((GLfloat) finger2, 0.0, 0.0, 1.0);
- glTranslatef (0.295, 0.0, 0.1);
- auxWireBox(0.5, 0.1, 0.2);
- glColor3f(0.0, 1.0, 1.0);
- glTranslatef (0.2, 0.0, 0.0);
- glRotatef ((GLfloat) finger3, 0.0, 0.0, 1.0);
- glTranslatef (0.295, 0.0, 0.0);
- auxWireBox(0.4, 0.1, 0.2);
- glPopMatrix();
- glPushMatrix();
- glColor3f(0.0, 1.0, 1.0);
- glTranslatef (0.8, 0.0, 0.0);
- glRotatef ((GLfloat) finger4, 0.0, 0.0, 1.0);
- glTranslatef (0.295, 0.0, 0.1);
- auxWireBox(0.5, 0.1, 0.2);
- glColor3f(0.0, 1.0, 1.0);
- glTranslatef (0.2, 0.0, 0.0);
- glRotatef ((GLfloat) finger5, 0.0, 0.0, 1.0);
- glTranslatef (0.295, 0.0, 0.0);
- auxWireBox(0.4, 0.1, 0.2);
- glPopMatrix();
- glPushMatrix();
- glColor3f(0.0, 0.0, 1.0);
- glTranslatef (0.8, 0.0, 0.0);
- glRotatef ((GLfloat) finger6, 0.0, 0.0, 1.0);
- glTranslatef (0.295, 0.0, 0.1);
- auxWireBox(0.7, 0.1, 0.2);
- glPopMatrix();
- glPopMatrix();
- glFlush();
- }
- void myinit (void)
- {
- glShadeModel (GL_FLAT);
- }
- void CALLBACK myReshape(GLsizei w, GLsizei h)
- {
- glViewport(0, 0, w, 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); /* viewing transform */
- }
- void main(void)
- {
- auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
- auxInitPosition (0, 0, 400, 400);
- auxInitWindow ("Composite Modeling Transformations");
- myinit ();
- auxKeyFunc (AUX_LEFT, shoulderSubtract);
- auxKeyFunc (AUX_RIGHT, shoulderAdd);
- auxKeyFunc (AUX_UP, elbowAdd);
- auxKeyFunc (AUX_DOWN, elbowSubtract);
- auxKeyFunc (AUX_w, fingerAdd);
- auxKeyFunc (AUX_s, fingerSubtract);
- auxKeyFunc (AUX_a, finger1Add);
- auxKeyFunc (AUX_d, finger1Subtract);
- auxKeyFunc (AUX_0, finger2Add);
- auxKeyFunc (AUX_1, finger2Subtract);
- auxKeyFunc (AUX_2, finger3Add);
- auxKeyFunc (AUX_3, finger3Subtract);
- auxKeyFunc (AUX_4, finger4Add);
- auxKeyFunc (AUX_5, finger4Subtract);
- auxKeyFunc (AUX_6, finger5Add);
- auxKeyFunc (AUX_7, finger5Subtract);
- auxKeyFunc (AUX_8, finger6Add);
- auxKeyFunc (AUX_9, finger6Subtract);
- auxReshapeFunc (myReshape);
- auxMainLoop(display);
- }
0 0
- opengl学习(五)一个机械臂程序,有关模型转换
- opengl学习(五)一个机械臂程序,有关模型转换
- OpenGL入门学习(五)
- OpenGL入门学习(五)
- OpenGL入门学习(五)
- OpenGL入门学习(五)
- OpenGL学习(五) 几何图形
- OpenGL入门学习(五)
- OPENGL学习笔记(五)
- OpenGL学习总结(五)
- OpenGL学习笔记(五)
- 机械臂(3)——使用MATLAB建立机械臂模型
- Dobot机械臂开发学习(一)
- OpenGL编程学习之《一个简单的OpenGL程序》
- OpenGL之路(五)制作旋转飞机模型
- OpenGL(五) 三维变换之模型视图矩阵
- 使用URDF创建机械臂仿真模型
- OpenGL入门学习(五) 【转】
- Mysql千万级别数据优化方案
- MFC对话框的OpenGL类实例之二
- 基于MFC对话框的OpenGL三维图形开发
- GLUT 工具箱函数
- C#Winform设置时不调用
- opengl学习(五)一个机械臂程序,有关模型转换
- 下载外文文献的一点心得(知网免费账号,亲测可用)
- OpenGL实现3DS文件导入
- Spring MVC学习笔记(1)
- 读取3DS文件
- 谁说C语言很简单?
- OpenGL总结
- 在OpenGL中如何根据空间两点绘制圆柱
- 51单片机STC51系列的P4口