亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Win32 OpenGL編程(9) 投影變換

系統(tǒng) 1820 0

 Win32 OpenGL編程(9) 投影變換  

 write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie        

 討論新聞組及文件        

提要

在前文(系列文章(7),以下簡(jiǎn)稱(chēng)XO7,系列其他文章類(lèi)似)中的照相機(jī)比喻中提到了4種3D變換,如下:

1.確定照相機(jī)的位置的過(guò)程對(duì)應(yīng)于“視圖變換”(Viewing Transformations)

2.確定物體位置的過(guò)程對(duì)應(yīng)于“模型變換”(Modeling Transformations)

3.確定照相機(jī)放大倍數(shù)的過(guò)程對(duì)應(yīng)于“投影變換”(Projection Transformations)

4.確定照片大小的過(guò)程對(duì)應(yīng)于“視口變換”(Viewport Transformations)

XO7中我們講的是第一種變換視圖變換,即改變觀察者本身的位置,視角等的變換效果,XO8中講的是第二種變換模型變換,本文開(kāi)始繼續(xù)按順序講解下一個(gè)3D變換過(guò)程,投影變換。

正投影

投影變換的過(guò)程就像是照相機(jī)選鏡頭的過(guò)程,目的是確定視野,其實(shí)說(shuō)起來(lái)投影一詞,我在學(xué)習(xí)工程制圖的時(shí)候就接觸過(guò)了,不知道大家是否學(xué)過(guò)這門(mén)課程,工程制圖就是一種將三維空間的事物設(shè)想投影在二維空間中,然后畫(huà)下來(lái),工程中應(yīng)用非常廣泛,那時(shí)候?qū)W的那些剖面圖什么的,也是累死我了-_-!OpenGL就可以模擬這樣的過(guò)程,并且名字和工程制圖中的名字是一樣的,叫正投影。

OpenGL以glOrtho來(lái)指定一個(gè)正交平行的矩形,屏幕上顯示的就是此物體在此矩形的正面的投影。在XO2中用過(guò)的gluOrtho2D實(shí)際上是此函數(shù)的一個(gè)去掉Z軸坐標(biāo)的簡(jiǎn)化版,而glOrtho包括的參數(shù)nearVal,farVal表示此矩形的前,后兩面,超出此矩形范圍的圖形將會(huì)被裁掉。

《      OpenGL Programming Guide         》:

glOrtho — multiply the current matrix with an orthographic matrix      
  C Specification      
  void glOrtho( GLdouble left,      
  GLdouble right,      
  GLdouble bottom,      
  GLdouble top,      
  GLdouble nearVal,      
  GLdouble farVal);      
  Parameters

left, right

Specify the coordinates for the left and right vertical clipping planes.      
  bottom, top

Specify the coordinates for the bottom and top horizontal clipping planes.      
  nearVal, farVal

Specify the distances to the nearer and farther depth clipping planes.      
  These values are negative if the plane is to be behind the viewer.

用此函數(shù),通過(guò)調(diào)整nearVal與farVal我們可以實(shí)現(xiàn)類(lèi)似工程制圖中的剖面的效果,見(jiàn)下例:

  GLfloat gfNear = 1.0;      
    
    
 SceneShow(GLvoid)        
      
  {      
  
    glClear(GL_COLOR_BUFFER_BIT);      
  
    glColor3f(1.0, 0.0, 0.0);      
  
  
    glMatrixMode(GL_PROJECTION);      
  
    glLoadIdentity();      
  
    glOrtho(-1.0, 1.0, -1.0, 1.0, gfNear, -1.0);      
  
  
  
    glPushMatrix();      
  
    DrawSmoothColorPyramid(0.5);      
  
    glPopMatrix();      
  
  
    glFlush();      
  }  
      
  
    
  
    
 Game_Main(        
 *parms = NULL, 
        
 num_parms = 0)      
  {      
  
    DWORD dwStartTime;      
  
  
    dwStartTime = GetTickCount();      
    
    
  
    
    
 (KEYDOWN(VK_ESCAPE))      
  
        SendMessage(ghWnd,WM_CLOSE,0,0);      
  
    
 (KEYDOWN(VK_UP))      
  
    {      
  
        gfNear -= 0.01;      
  
    }      
  
    
 (KEYDOWN(VK_DOWN))      
  
    {      
  
        gfNear += 0.01;      
  
    }      
  
  
  
    SceneShow();      
  
  
    
    (GetTickCount() - dwStartTime < TIME_IN_FRAME)      
  
    {      
  
        Sleep(1);      
  
    }      
  
  
    
    (1);      
  
  }

 

以下就是當(dāng)nearVal為0.8時(shí)的效果,也就是說(shuō),Z軸坐標(biāo)大于0.8的,一律被截掉了,在工程制圖中,我們老師常將,此時(shí)假設(shè)在此用一刀將物體切掉。

上面的源代碼中還出現(xiàn)了一個(gè)新函數(shù),glMatrixmode,用于指定以下的變換是針對(duì)哪個(gè)變換的,

glMatrixMode(GL_PROJECTION);

用于指定以下的變換是針對(duì)投影變換的,而用

glMatrixMode(GL_MODELVIEW);

方式調(diào)用時(shí),(默認(rèn)值)表示  針對(duì)模型變換。  

為節(jié)省篇幅僅貼出關(guān)鍵片段,完整源代碼見(jiàn)我博客源代碼的2008-10-28/glOrthoSample 目錄,獲取方式見(jiàn)文章最后關(guān)于獲取博客完整源代碼的說(shuō)明。

 張軍博客  


 

透視投影

上述的正投影僅僅存在于想象之中,主要是工程制圖(或者CAD)中能夠正確反映物體的真實(shí)尺寸,現(xiàn)實(shí)中我們看東西,越遠(yuǎn)的越小,越近的越大,并且所有物體最終會(huì)消失在遠(yuǎn)方(地平線),OpenGL常用于VR(虛擬現(xiàn)實(shí)),這樣程度的視覺(jué)仿真效果自然是有的,在OpenGL中,這樣投影叫做透視投影。OpenGL提供了兩個(gè)函數(shù)用于指定透視投影,兩個(gè)函數(shù)僅僅是參數(shù)表示的方式不同,事實(shí)上效果是一樣的。

《      OpenGL Programming Guide         》:

glFrustum — multiply the current matrix by a perspective matrix      
  C Specification      
  void glFrustum( GLdouble left,      
  GLdouble right,      
  GLdouble bottom,      
  GLdouble top,      
  GLdouble nearVal,      
  GLdouble farVal);      
  Parameters

left, right

Specify the coordinates for the left and right vertical clipping planes.      
  bottom, top

Specify the coordinates for the bottom and top horizontal clipping planes.      
  nearVal, farVal

Specify the distances to the near and far depth clipping planes.      
  Both distances must be positive.

gluPerspective — set up a perspective projection matrix      
  C Specification      
  void gluPerspective( GLdouble fovy,      
  GLdouble aspect,      
  GLdouble zNear,      
  GLdouble zFar);      
  Parameters

fovy

Specifies the field of view angle, in degrees, in the y direction.      
  aspect

Specifies the aspect ratio that determines      
  the field of view in the x direction.      
  The aspect ratio is the ratio of x (width) to y (height).      
  zNear

Specifies the distance from the viewer to the near clipping plane      
  (always positive).      
  zFar

Specifies the distance from the viewer to the far clipping plane      
  (always positive).

事實(shí)上,glFrustum指定的方式與glOrtho很像,參數(shù)意義也一致,僅僅是使用后OpenGL使用的投影方式不同,gluPerspective函數(shù)指定的方式是模擬觀察者(照相機(jī))的視角,用fovy指定觀察者的上下視角(及在y-z平面上觀察的角度),aspect指定觀察寬度與高度的比,然后用zNear指定離觀察者較近的截面,用zFar指定離觀察者較遠(yuǎn)的截面(都指離觀察者的距離),下例展示了原來(lái)那個(gè)三角錐從遠(yuǎn)方的一個(gè)小點(diǎn)然后到放大到原來(lái)大小的過(guò)程:

  GLfloat gfDis = 5.0;      
  
    
    
 SceneShow(GLvoid)        
      
  {      
  
    glMatrixMode(GL_PROJECTION);      
  
    glLoadIdentity();      
  
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 5.0);      
  
  
    glMatrixMode(GL_MODELVIEW);      
  
    glLoadIdentity();      
  
    gluLookAt(0.0, 0.0, gfDis, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);      
  
  
    glClear(GL_COLOR_BUFFER_BIT);      
  
    glColor3f(1.0, 0.0, 0.0);      
  
  
    glPushMatrix();      
  
    DrawSmoothColorPyramid(0.5);      
  
    glPopMatrix();      
  
  
  
    glFlush();      
  }  
      
  
    
 Game_Main(        
 *parms = NULL, 
        
 num_parms = 0)      
  {      
  
    DWORD dwStartTime;      
  
  
    dwStartTime = GetTickCount();      
    
    
  
    
    
 (KEYDOWN(VK_ESCAPE))      
  
        SendMessage(ghWnd,WM_CLOSE,0,0);      
  
    
 (KEYDOWN(VK_UP))      
  
    {      
  
        gfDis -= 0.01f;      
  
    }      
  
    
 (KEYDOWN(VK_DOWN))      
  
    {      
  
        gfDis += 0.01f;      
  
    }      
  
  
    SceneShow();      
  
    
    (GetTickCount() - dwStartTime < TIME_IN_FRAME)      
  
    {      
  
        Sleep(1);      
  
    }      
  
    
    (1);      
  
  } // end Game_Main


 

上面例子中靠

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

來(lái)調(diào)整觀察者的位置,通過(guò)上下鍵調(diào)節(jié),會(huì)模擬出一種慢慢走近三角錐的過(guò)程,三角錐也是隨著走近由小慢慢變大。

實(shí)際上最重要的還是

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 5.0);

三句確定的透視投影方式。

 張軍博客  張軍博客  張軍博客  


 




為節(jié)省篇幅僅貼出關(guān)鍵片段,完整源代碼見(jiàn)我博客源代碼的2008-10-28/glPerspective 目錄,獲取方式見(jiàn)文章最后關(guān)于獲取博客完整源代碼的說(shuō)明。

小結(jié):

相對(duì)來(lái)說(shuō),個(gè)人認(rèn)為投影變換是屬于OpenGL中重要但是確較難理解的一部分,動(dòng)態(tài)變化上述函數(shù)的參數(shù),準(zhǔn)確理解上述函數(shù)中每個(gè)參數(shù)的意義是種不錯(cuò)的學(xué)習(xí)途徑,其中Nate Robin的OpenGL教程有個(gè)很形象的教學(xué)程序。對(duì)應(yīng)投影變換的教程為projection一例


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产精品美女久久久久网站 | 欧美videofree高清杂交 | 天天干天天操天天爽 | 国产精品午夜波多野结衣性色 | 日日夜夜精品免费视频 | 久久久噜久噜久久综合 | 亚洲+自拍+色综合图区一 | 色婷婷精品大视频在线蜜桃视频 | 777奇米影视网 | 色综合久久亚洲国产日韩 | 亚洲片在线观看 | 本日黄色| 毛片2016免费视频 | 亚洲精品一区二区伦理 | 国产720刺激i在线视频 | 欧美性生活视频免费 | 国产三级观看久久 | 最新国产一区二区精品久久 | 色综合久久综合欧美综合网 | 日韩 欧美 亚洲国产 | 亚洲午夜久久久精品影院视色 | 天堂男人在线 | 热久久国产 | 天天操夜夜艹 | 亚洲国产精品一区 | 日韩欧免费一区二区三区 | 天天拍夜夜添久久精品免费 | 亚洲欧洲日本精品 | 成人免费淫片在线费观看 | 欧美一级毛片俄罗斯 | 在线成人天天鲁夜啪视频 | 可以看美女隐私的网站 | 91在线免费视频 | 特黄特级毛片免费视 | 亚洲免费福利视频 | 午夜精品久久久久久久 | 精品欧美一区二区在线看片 | www国产精品com | 亚洲精品亚洲九十七页 | 思思91精品国产综合在线 | 不卡精品国产_亚洲人成在线 |