天天看點

翻譯一篇關于OpenGL實作Billboarding技術的文章

轉自http://blog.sina.com.cn/s/blog_6bd83ee00100zrjz.html

這篇文章來自Billboarding Tutorial,原作者為António Ramires Fernandes。

僞Billboarding技術-快速而簡單的實作球形Billboards

将要介紹的這種方法并不是一種真正意義上的billboarding,但是他提供了一種廉價的方法以達到近似的效果,對于一部分程式來說已經足夠了。

下面這幅圖是一個示範畫面。它顯示了一個雪人和一些經過billboard處理過的樹。雖然很難說這些樹就是嚴格面朝相機的,但是它們确實面向了與相機視線垂直的一個平面。

翻譯一篇關于OpenGL實作Billboarding技術的文章

下面的圖表更加清晰的反映了這種關系。位于底部的黑色圓點代表相機。由相機發出的矢量箭頭表示了相機目前的視線方向。同時這個矢量也确定了一個與相機視線方向垂直的平面。圖中的物體01,02,03被旋轉使得它們的正面矢量朝着這個平面。這裡假設所有物體都被置于圓點并且面向Z軸的正方向。

翻譯一篇關于OpenGL實作Billboarding技術的文章

為了實作這一效果需要擷取模型視圖矩陣。首先你應該知道模型視圖矩陣存儲了幾何圖形的變換包括旋轉,縮放和平移。這個矩陣包含了所有需要的變換,通過這些變換将你輸入的坐标和世界坐标轉換為相機坐标。

翻譯一篇關于OpenGL實作Billboarding技術的文章

矩陣的第四列的上面3個值代表了關于相機位置和方向的本地原點的位置。上面的3X3子矩陣包含了縮放和旋轉操作。将這個子矩陣置為機關矩陣可以有效的将這些操作屏蔽,以便使相機的視線方向與世界坐标系Z軸方向一緻。相機的向上和向右矢量也和世界坐标系一緻,也就是說這種billboard方式是一種僞球形billboarding.這個billboard的中心是原點。如果你打算使用這種billboarding方式,那麼當使用者向上或向下看時樹好像在向前或向後彎曲,這多少會有些尴尬。這是因為billboard的定向依賴于和相機位置相反的相機方向。

翻譯一篇關于OpenGL實作Billboarding技術的文章

實際上,将子矩陣置為機關矩陣意味着你所繪制的物體不會發生任何旋轉。是以,如果相機視線對着Z軸負方向,那麼物體總是以同樣的方式繪制。

縮放操作也同時無效,如果你用這種方式将無法讓樹變高,除非你在改變模型視圖矩陣之後再進行縮放。

第一步操作是儲存目前模型視圖矩陣,之後擷取模型視圖矩陣。再将3X3的子矩陣置為機關矩陣。将這個矩陣加載到OpenGL狀态機中,然後在本地坐标系中繪制你的物體。最後恢複原來的模型視圖矩陣。

float modelview[16]; 
int i,j; 
// save the current modelview matrix 
glPushMatrix(); 
// get the current modelview matrix 
glGetFloatv(GL_MODELVIEW_MATRIX , modelview); 
// undo all rotations 
// beware all scaling is lost as well 
for( i=0; i<3; i++ ) 
for( j=0; j<3; j++ ) 
{ if ( i==j ) 
   modelview[i*4+j] = 1.0; 
  else 
   modelview[i*4+j] = 0.0;
 }
 // set the modelview with no rotations and scaling 
glLoadMatrixf(modelview); 
drawObject(); 
// restores the modelview matrix 
glPopMatrix();
           

上面的代碼段可以使物體旋轉至面朝相機視線垂直的平面,旋轉的中心為坐标原點。