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

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

2014-04-11 13:29 267 查看
最近这个内容让我很窝火啊,真是有点摸不到头脑,经过查资料,终于知道这其中的一些原理,由于我现在只是初步学习,有关矩阵变换的问题,我会在后面补充的,目前先稍微的说明,看了一个机械臂的程序,研究好一段时间终于知道模型变换中的这两个函数glTranslatef(),glRotatef()在执行的顺序上与实际是相反的。

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

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

[cpp] view plaincopy

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个立方体,我设置成蓝色的以便好观察
代码如下

[cpp] view plaincopy

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);

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

效果如下



全部代码如下

[cpp] view plaincopy

#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);

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