OpenGL之相機-旋轉和平移

OpenGL之相機-旋轉和平移

相機CAMERA固定在原點,通過旋轉和平移在世界坐標中移動所有模型

相機設定示例:

  1. glMatrixMode(GL_MODELVIEW);設定模型視圖矩陣
  2. glLoadIdentity()將觀察矩陣載入單位矩陣,相機位於原點(0,0,0), 朝向為負Z軸 (0,-90,0)
  3. glRotatef(AngleZ,0f,0.0f,1.0f); 橫搖/側滾角繞Z軸旋轉
  4. glRotatef(AngleY+90,0f,1.0f,0.0f); 偏航/航向角繞Y軸旋,補償90度
  5. glRotatef(AngleX,0f,0.0f,0.0f); 傾斜/俯仰角繞X軸旋轉
  6. glTranslatef(-posX,-posY,-posZ);移動模型坐標
視圖變換(VIEW transformation) 簡介
void glRotatef (

GLfloat angle,

GLfloat x, GLfloat y,GLfloat z);

旋轉

Angle:旋轉角度

x,y,z:軸向量

void glTranslatef (

GLfloat x, GLfloat y, GLfloat z);

平移

x,y,z:偏移向量

 

旋轉
glRotatef(AngleZ,0.0f,0.0f,1.0f); Z軸 橫搖/側滾
glRotatef(AngleY+90,0.0f,1.0f,0.0f); Y軸補償+90度 偏航/航向
glRotatef(AngleX,1.0f,0.0f,0.0f); X軸 傾斜/俯仰

 

平移 簡介
glTranslatef(-posX,-posY,-posZ); 反方向移動模型坐標

相機移動程式演示:下載

  1. 按UP/DOWN鍵前後移動
  2. 按LEFT/RIGHT鍵左右旋轉,繞Y軸旋轉
  3. 小鍵盤4/6繞Z軸旋轉
  4. 小鍵盤8/2繞X軸旋轉
  5. 按F1鍵打開幫助
  6. 按ESC鍵相機返回原點

OpenGL之相機 gluLookAt()

OpenGL之相機 gluLookAt()

函式gluLookAt()允許你設定相機的位置、方向、朝上向量

相機設定示例:

  1. glMatrixMode(GL_MODELVIEW);設定模型視圖矩陣
  2. glLoadIdentity()將觀察矩陣載入單位矩陣,相機為於原點,朝向為負Z軸,上方向量為正Y軸.
  3. gluLookAt() 相對于原點在移動相機
函式 數值 簡介
void gluLookAt (    
GLdouble eyex, 0.0f,0.0f,0.0f, 相機位置設為原點
GLdouble eyey,
GLdouble eyez,
GLdouble centerx, 0.0f,0.0f,-100.0f, 相機朝向負Z軸
GLdouble centery,
GLdouble centerz,
GLdouble upx, 0.0f,1.0f,0.0f 上方向量為正Y軸
GLdouble upy,
GLdouble upz);

 

位置和方向計算 簡介
radians = 3.141592654f * angleA / 180.0f; AngleA: Y軸角度

Radians: 弧度

pos=pos – (speed * cos(radians)); Pos:相機的位置

Speed:移動速度

target=pos+dist*cos(radians); Dist:視距

Target:相機的朝向

相機移動程式演示:下載

  1. 按UP/DOWN鍵前後移動
  2. 按LEFT/RIGHT鍵左右旋轉
  3. 按F1鍵打開幫助
  4. 按ESC鍵相機返回原點
  5. 按+鍵加大直線寬度
  6. 按-鍵減小直線寬度
  7. 按S鍵切換抗鋸齒功能
  8. 按.鍵切換四邊形點畫模式
  9. 按1鍵切換為黃色
  10. 按2鍵切換為綠色
  11. 按3鍵切換為紅色
  12. 按4鍵填充模式
  13. 按5鍵線框模式
  14. 按6鍵頂點模式

OpenGL之視口變換

OpenGL之視口變換

視口(Viewport)即渲染窗口大小,每當窗口大小發生改變都要使用glViewport()進行設定.視口變換在投影變換之後進行

視口設定 簡介
void glViewport(

GLint x, GLint y, 視口的左下角坐標

GLsizei width, 視口的寬度

GLsizei height); 視口的高度

視口的左下角坐標設為0,0

視口的寬高設為窗口大寬高

 

重設窗口大小,在WM_SIZE(窗口大小發生改變)消息下調用

  1. glViewport(0,0,width,height);將視口重置為新的尺寸
  2. glViewport(0,0,OpenGL_Width,OpenGL_Height);
  3. glMatrixMode(GL_PROJECTION); 設定投影矩陣
  4. glLoadIdentity();載入單位矩陣
  5. gluPerspective(0f, Width/Height,1.0f,1000.0f);
  6. glMatrixMode(GL_MODELVIEW);設定模型視圖矩陣
  7. glLoadIdentity();載入單位矩陣

 

OpenGL之矩陣

OpenGL之矩陣

OpenGL的變換運算均使用4×4矩陣進行.OpenGL使用堆棧保存矩陣.各種變換運算均針對棧頂進行操作.

矩陣 簡介
void glMatrixMode (GLenum mode); 設定當前矩陣堆棧
GL_MODELVIEW 模型視圖矩陣
GL_PROJECTION 投影矩陣
GL_COLOR 顏色矩陣
GL_TEXTURE 紋理矩陣

示例

  1. glMatrixMode(GL_MODELVIEW); 設定當前矩陣為模型視圖矩陣
  2. glLoadIdentity();載入單位矩陣,並且朝向負Z軸
  3. 進行其它變換
矩陣堆棧 簡介
void glPushMatrix(void); 複製當前矩陣(棧頂)並壓棧.
void glPopMatrix(void); 當前矩陣堆棧出棧並丟棄.

將當前坐標系統切換為新坐標系統,渲染完成後恢復原始坐標系統.示例:

  1. glMatrixMode(GL_MODELVIEW);設定模型視圖矩陣
  2. glPushMatrix();複製當前矩陣並壓棧.
  3. glLoadIdentity();載入單位矩陣
  4. glTranslatef(x,y,x);移動坐標系
  5. glPopMatrix();出棧,恢復源始坐標系統

不同矩陣堆棧有不同的深度,可通過glGetIntegerv()獲取

參數 深度 簡介
GL_MAX_MODELVIEW_STACK_DEPTH 32 模型視圖矩陣堆棧的深度
GL_MAX_PROJECTION_STACK_DEPTH 10 投影矩陣堆棧的深度
GL_MAX_TEXTURE_STACK_DEPTH 10 紋理矩陣堆棧的深度
GL_MAX_ATTRIB_STACK_DEPTH 16 屬性矩陣堆棧的深度

獲取模型視圖矩陣深度示例:

  1. GLint params[1];
  2. glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH,params);

OpenGL之旋轉

OpenGL之旋轉

旋轉glRotatef()使模形圍繞軸向量進行旋轉.先設定旋轉矩陣後繪畫模型.

旋轉 簡介
void glRotatef (

GLfloat angle,

GLfloat x,

GLfloat y,

GLfloat z);

單精度版本

angle:旋轉角度

逆時針旋轉:角度為正

順時針旋轉:角度為負

xyz:旋轉軸向量

void glRotated (

GLdouble angle,

GLdouble x,

GLdouble y,

GLdouble z);

雙精度版本

函式示例分別對XYZ進行旋轉:

  1. 設定模型視圖矩陣glMatrixMode(GL_MODELVIEW);
  2. 載入單位矩陣glLoadIdentity();
  3. 繞X軸旋轉glRotatef(angleX,1,0,0);
  4. 繞Y軸旋轉glRotatef(angleY,0,1,0);
  5. 繞Z軸旋轉glRotatef(angleZ,0,0,1);
  6. 繪畫立方體Draw();
旋轉示例 簡介
glRotatef(45.0f,1.0f,0.0f,0.0f); 繞X軸以逆時針方向旋轉45度
glRotatef(-90.0f,0.0f,1.0f,0.0f); 繞Y軸以順時針方向旋轉45度
glRotatef(135.0f,0.0f,0.0f,1.0f); 繞Z軸以逆時針方向旋轉135度

旋轉演示程式如上圖:下載

  1. 按UP/DOWN鍵繞X軸旋轉
  2. 按LEFT/RIGHT鍵繞Y軸旋轉
  3. 按Z+LEFT/Z+RIGHT鍵繞Z軸旋轉
  4. 按F1鍵打開幫助
  5. 按ESC鍵模型旋轉角度重置

OpenGL之縮放

OpenGL之縮放

縮放glScalef()可在XYZ三軸指定不同縮放系數,放大或縮小模型或坐標系統的大小.

放大: 縮放系數大於(>1),若設為2放大一倍

縮小: 縮放系數為(1.0~0.0),若設為0.5側縮小一倍

函式示例:

  1. 設定模型視圖矩陣glMatrixMode(GL_MODELVIEW);
  2. 載入單位矩陣glLoadIdentity();
  3. 縮放glScalef(x,y,z);參數xyz為縮放系數,若縮放系數为1侧不缩放.縮放操作就是乘以縮放系數.
  4. 繪畫立方體Draw();
縮放 簡介
void glScalef(

GLfloat x,

GLfloat y,

GLfloat z);

單精度版本

對模型放大一倍:

1.    縮放glScalef(2,2,2)

2.    後再繪畫Draw()

void glScaled(

GLdouble x,

GLdouble y,

GLdouble z);

雙精度版本

縮放演示程式如上圖:下載

  1. 按UP/DOWN鍵對XYZ三軸進行模型縮放
  2. 按LEFT/RIGHT鍵繞Y軸旋轉
  3. 按F1鍵打開幫助
  4. 按ESC鍵模型縮放重置

OpenGL之平移

OpenGL之平移

平移Translate可將模型在3D世界中移動,先設定平移矩陣後繪畫模型:

函式示例:

  1. 設定模型視圖矩陣glMatrixMode(GL_MODELVIEW);
  2. 載入單位矩陣glLoadIdentity();
  3. 移動3D坐標glTranslatef(x,y,z);參數xyz為3D世界坐標的偏移量
  4. 繪畫立方體Draw();
平移 簡介
void glTranslatef(

GLfloat x,

GLfloat y,

GLfloat z);

單精度版本

如在3D世界(6,6,6)繪畫模型:

1.     先平移glTranslatef(6,6,6)

2.     後在繪畫Draw()

void glTranslated(

GLdouble x,

GLdouble y,

GLdouble z);

雙精度版本

平移演示程式如上圖:下載

  1. 按LEFT/RIGHT鍵模型在X軸中移動
  2. 按UP/DOWN鍵模型在Z軸中移動
  3. 按F1鍵打開幫助
  4. 按ESC鍵模型歸位

OpenGL之投影變換

OpenGL之投影變換

投影變換是指設定視口面積和剪切平面,它在模型變換與視圖變換之後執行,用於確定那些多邊型模型位於視口之內. OpenGL支持兩類投影

投影變換(PROJECTION transformation) 簡介
透視投影

glFrustum()

gluPerspective()

用於3D世界的顯示與真實世界一樣, 多邊型模型呈現近大遠小
正交投影

glOrtho()

gluOrtho2D()

不考濾與攝影機的距離,顯示多邊型模型真實的大小,常用於CAD軟件和2D遊戲,文本顯示

 

透視投影 簡介
void gluPerspective (

GLdouble fovy,

GLdouble aspect,

GLdouble zNear,

GLdouble zFar);

直接指定視角和屏幕寬高比從而計算觀察截體.
Fovy 可視角度一般設為45度至90度
Aspect 屏幕的寬高比(Width/Height)
zNear 近端剪切面距離
zFar 遠端剪切面距離

 

透視投影 簡介
void glFrustum (

GLdouble left,

GLdouble right,

GLdouble bottom,

GLdouble top,

GLdouble zNear,

GLdouble zFar);

觀察截體的計算由近端剪切面與遠端剪切面確定
Left right bottom top 近端剪切面的範圍
zNear 近端剪切面距離
zFar 遠端剪切面距離

 

正交投影 簡介
Void glOrtho (

GLdouble left,

GLdouble right,

GLdouble bottom,

GLdouble top,

GLdouble zNear,

GLdouble zFar);

相同的模型不管與攝影機距離的遠近,其呈現的相同大小
left right bottom top 剪切面的範圍
zNear 近端剪切面距離
zFar 遠端剪切面距離

 

正交投影 簡介
void gluOrtho2D (

GLdouble left,

GLdouble right,

GLdouble bottom,

GLdouble top);

相當於glOrtho(left,right,bottom,top,-1,1);
left right bottom top 剪切面的範圍

投影示例

  1. 選擇投影矩陣堆棧glMatrixMode(GL_PROJECTION);
  2. 載入單位矩陣glLoadIdentity()
  3. 設定透視投影或正交投影

投影函式

void Set_Projection_OpenGL(bool Is3D)

{

::glViewport(0,0,OpenGL_Width,OpenGL_Height); // 重置視區尺寸

::glMatrixMode(GL_PROJECTION); // 設定投影矩陣

::glLoadIdentity();// 載入單位矩陣

if(Is3D == true) // 3D投影計算窗口尺寸比例

gluPerspective(54.0f,(GLfloat)OpenGL_Width/(GLfloat)OpenGL_Height,1.0f,1000.0f);

else  // 設為2D投影

gluOrtho2D(0, OpenGL_Width, 0, OpenGL_Height);

::glMatrixMode(GL_MODELVIEW);  // 設定模型視圖矩陣

::glLoadIdentity();// 載入單位矩陣

}

投影演示程式如上圖:下載

  1. 按P鍵在正交投影與透視投影之間切換
  2. 按S鍵切換抗鋸齒功能
  3. 按1鍵切換為黃色
  4. 按2鍵切換為綠色
  5. 按3鍵切換為紅色
  6. 按F1鍵打開幫助
  7. 按ESC鍵旋轉角度清零
  8. 按+鍵加大直線寬度
  9. 按-鍵減小直線寬度

OpenGL之繪畫多邊形

OpenGL之繪畫多邊形

OpenGL多邊形的演示程式如上圖:下載

  1. 按鼠標左鍵點擊繪畫多邊形,繪畫時頂點的走向為逆時針多邊形為正面,否則為背面.
  2. 按+鍵加大直線寬度
  3. 按-鍵減小直線寬度
  4. 按S鍵切換抗鋸齒功能
  5. 按.鍵切換多邊形點畫模式
  6. 按C鍵切換多邊形隱面裁剪
  7. 按1鍵填充模式
  8. 按2鍵線框模式
  9. 按3鍵頂點模式
  10. 按4鍵切換為白色
  11. 按5鍵切換為黃色
  12. 按6鍵切換為紅色
  13. 按F1鍵打開幫助
  14. 按ESC鍵清空畫面

繪畫多邊形,頂點不能小於3個

  1. glBegin(GL_POLYGON);準備繪畫多邊形
  2. for (int i = 0; i < count; ++i)
  3. glVertex3f(v[i].x,v[i].y,v[i].z);繪畫多邊形頂點
  4. glEnd();結束繪畫

多邊形其它設定請參考三角形

OpenGL之繪畫四邊形

OpenGL之繪畫四邊形

OpenGL四邊形的演示程式如上圖:下載

  1. 按鼠標左鍵點擊繪畫四邊形,繪畫時頂點的走向為逆時針四邊形為正面,否則為背面.
  2. 按+鍵加大直線寬度
  3. 按-鍵減小直線寬度
  4. 按S鍵切換抗鋸齒功能
  5. 按.鍵切換四邊形點畫模式
  6. 按C鍵切換四邊形隱面裁剪
  7. 按1鍵填充模式
  8. 按2鍵線框模式
  9. 按3鍵頂點模式
  10. 按4鍵每四個頂點組成四邊形
  11. 按5鍵頂點相連的四邊形

繪畫四邊形

  1. glBegin(GL_TRIANGLES);準備繪畫四邊形
  2. for (int i = 0; i < count; ++i)
  3. glVertex3f(v[i].x,v[i].y,v[i].z);繪畫四邊形頂點
  4. glEnd();結束繪畫
glBegin()繪畫四邊形參數 簡介
GL_QUADS 每四個頂點組成四邊形
GL_QUAD_STRIP 頂點相連的四邊形,需要把第三第四個頂點的渲染順序交換.

四邊形也屬於多邊形其它設定請參考三角形