OpenGL(四) 左右手座標系及基本座標變換
左手座標系、右手座標系、笛卡爾座標系
左手座標系:伸開左手,大拇指指向X軸正方向,食指指向Y軸正方向,其他三個手指指向Z軸正方向。
右手座標系:伸開右手,大拇指指向X軸正方向,食指指向Y軸正方向,其他三個手指指向Z軸正方向。
左右手座標系的示意圖如下:
左手和右手座標注系的區別在於兩者Z軸的方向是相反的。
在高等數學中使用的三維空間是笛卡爾座標系,如下:
笛卡爾座標系其實就是右手座標系,OpenGL中使用右手座標注系,Direct3D使用的是左手座標系。
左手旋轉規則、右手旋轉規則
左右手旋轉規則用於判斷當前座標系中物體旋轉時正方向的判定。在右手座標系中,確定旋轉軸後,右手握成拳頭,拇指指向旋轉軸的正方向,其餘手指的彎曲方向即為旋轉的正方向,跟手指彎曲方向一致的旋轉記為正向,相反則為負向。左手座標注系中判斷旋轉方向的正負使用左手,其他規則一樣。兩者的示意圖:
在OpenGL中,對物體的移動、縮放、旋轉操作要使用模型變換,有三個模型變換函式:
- glTranslatef 平移
- glRotatef 旋轉
- glScalef 縮放
平移:
glTranslatef (GLfloat x, GLfloat y, GLfloat z);
x,y,z分別表示物體在xyz方向上的平移,舉例來說,glTransLatef(-5.0f,4.0f,-3.0f)表示物體沿x軸負方向移 動5,y正方向移動4,z負方向移動3。
旋轉:
glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
第一個引數是旋轉角度,後三個引數定義了旋轉軸,這個旋轉軸是由地當前座標系的原點和點(x,y,z)的直 線。正方向是原點指向點(xyz)。如果要定義不經過原點的旋轉軸,則需要先把物體的旋轉軸平移到過原 點,旋轉之後,再經過平移的逆變換平移回去。
縮放:
glScalef (GLfloat x, GLfloat y, GLfloat z);
三個引數分別是物體在xyz三個方向上的縮放比例。
舉例如下,原始影象:
平移:
旋轉:
縮放:
座標變換完整程式碼:
#include <glut.h> #include <iostream> using namespace std; void myDisplay(void) { glClearColor(1,1,0.8,1); glClear(GL_COLOR_BUFFER_BIT); //載入單位矩陣,在做座標變換之前都要載入一下這個單位矩陣 //glLoadIdentity(); //將變換矩陣與當前矩陣相乘,之後所有的點都會左乘上該平移矩陣 glTranslatef(0.6,0,0); glRotatef(45,0,0,1); glScalef(0.5,0.5,0.5); glColor3f(1,0,1); glBegin(GL_POLYGON); //繪製一個多邊形 { glVertex2f(-0.4,-0.4); glVertex2f(-0.4,0.4); glVertex2f(0.4,0.4); glVertex2f(0.4,-0.4); } glEnd(); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); //初始化GLUT glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(500, 200); glutInitWindowSize(400, 400); glutCreateWindow("OpenGL"); glutDisplayFunc(&myDisplay); //回撥函式 glutMainLoop(); //持續顯示,當視窗改變會重新繪製圖形 return 0; }