最近這個內容讓我很窩火啊,真是有點摸不到頭腦,經過查資料,終於知道這其中的一些原理,由於我現在只是初步學習,有關矩陣變換的問題,我會在後面補充的,目前先稍微的說明,看了一個機械臂的程序,研究好一段時間終於知道模型變換中的這兩個函數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);
- }