1. 程式人生 > >OpenGL(四) 左右手座標系及基本座標變換

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