OpenGl And 視圖

OpenGl And 視圖

標籤(空格分隔): gamepython

簡介

本文主要介紹座標系的觀念, 以及在openGL中的視圖及其相關的變換。api

大綱

  • 視圖、模型、投影變換概念
  • Opengl中對各類變換的支持

視圖變換

在一個三維座標系中, 一個模型的展現並不僅有一個視圖就能夠了。而是存在視圖變換,投影變換,模型變換的過程。函數

頂點座標---》(模型視圖矩陣)----》視覺座標---》(投影矩陣)----》裁剪座標----》(透視座標)----》規範化設備座標----》視口變換----》窗口座標

在opengl中主要經過如下三種變換達到最終控制屏幕輸出:oop

  1. 視圖變換: 視圖是指攝像機能看到到區域,因此視圖變換就是移動攝像機使其說能展現的區域發生變換
  2. 模型變換:是場景中的模型動起來,主要是針對模型的
  3. 投影變換: 決定了模型最終能在屏幕中的現實, 好比經過投影變換, 能夠只讓模型只顯示一半。

爲了進行視圖,模型,投影變換, 能夠建立一個4*4的矩陣M而後讓他與頂點對應的座標v相乘,以實現變換:
$$v' = Mv$$code

OpenGl 中對視圖、模型、投影變換的支持

gult庫

gl庫只是一個圖形庫, 在咱們寫的窗口程序的過程當中,我必須寫窗口程序已經消息處理,咱們能夠本身寫 ,固然也能夠用gult庫。glut庫中的api都已glut開頭,最典型的現實一個窗口以下:orm

glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();

代碼很簡單,而咱們要關注的是三個函數:ip

  1. diplay 模型的展現, 內部主要作模型變換
  2. reshage 視口的控制, 主要作視圖和投影變換
  3. keyboard 對鍵盤輸入的支持

引出

咱們能夠用以下代碼建立一個球體it

void PlanteDisplay::excute()
    {
      glClear(GL_COLOR_BUFFER_BIT);
      glColor3f(1.0, 1.0, 1.0);
      drawSun();
    }

    void PlanteDisplay::drawSun()
    {
      glutWireSphere(1.0, 20, 16);   /* draw sun */
      glutSwapBuffers();
    }

咱們能夠加上一些初始化的動做io

void init()
    {
      glClearColor(0.0, 0.0, 0.0, 0.0);
      glShadeModel(GL_FLAT);
    }

咱們會發現有以下所示的球體:class

nomral_sphear

咱們創見好了物體, 可是尚未設置好攝像機,opengl默認狀況下回把攝像機正對着屏幕,而攝像機的鏡頭設置就在reshage中實現,在該函數中, 咱們主要控制視圖變換和投影變換。

視口變換

視口變換決定了場景所映射的有效屏幕區域的形狀。利用函數glViewport來實現。

最簡單的變換以下:

void cubeReshape(int w, int h)
      {
        glViewport(0, 0, (GLsizei)w, (GLsizei)h);
      }

glviewport

咱們改變屏幕的裁剪區域(投影變換):

glViewport(50, 0, (GLsizei)w/2, (GLsizei)h/2)

會發現以下圖顯示:

glviewport_half

模型變換

調用變換函數以前,須要肯定本身想修改的模型視圖矩陣仍是投影視圖矩陣,能夠用glMatrixMode() 選擇矩陣,並用glLoadIdentity() 把當前可修改矩陣清除爲單位矩陣。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

在OpenGl中,有三個函數用於執行模型變換:

  1. glTranslate*()
  2. glRotate*()
  3. glScale*()

如:

glTranslatef(0.2, .2, 0);
glScalef(1.5, 2.0, 1);

glutWireSphere(0.4, 50, 8);

model_view_scale

視圖變換

視圖 變換擁有膝蓋觀察點的位置和方向。能夠由兩種方法來實現:

  1. 反方向移動物體
  2. 使用gluLookAt()函數

正常如圖所示:

teampot_normal

gluLookAt(0.0, 0.0, 0.0
        , 0.0, 0.0, -1.0
        , -1.0, -1.0, 0.0);

teapot_y=-1

gluLookAt(0.0, 0.0, 0.0
        , 0.0, 0.0, -1.0
        , 0.0, -1.0, 0.0);

teaapot_y=-1x=-1

投影變換

投影變換最終控制線上屏幕的裁剪區域, opengl中能夠用:

  1. glOrtho
  2. glFrustum

來進行投影變換。

glOrtho 和 glFrustum 的區別

  1. glOrtho:建立一個正交平行的視景體。 通常用於物體不會由於離屏幕的遠近而產生大小的變換的狀況。好比,經常使用的工程中的製圖等。須要比較精確的顯示
  2. glFrustum 產生一個透視投影。這是一種模擬真是生活中,人們視野觀測物體的真實狀況。例如:觀察兩條平行的火車到,在過了很遠以後,這兩條鐵軌是會相交於一處的。還有,離眼睛近的物體看起來大一些,遠的物體看起來小一些。
glFrustum(GLdouble left
        , GLdouble right
        , GLdouble bottom
        , GLdouble top
        , GLdouble near
        , GLdouble far)

glFrustum_view 其中: (left, botton, -near)表示近側裁剪平面左上角的座標,(right, top, -near)表示右下角座標,near和far分別表示觀察點到近側和遠側的距離。

相關文章
相關標籤/搜索