轉自http://blog.sina.com.cn/s/blog_6bd83ee00100zrjz.html
這篇文章來自Billboarding Tutorial,原作者為António Ramires Fernandes。
僞Billboarding技術-快速而簡單的實作球形Billboards
将要介紹的這種方法并不是一種真正意義上的billboarding,但是他提供了一種廉價的方法以達到近似的效果,對于一部分程式來說已經足夠了。
下面這幅圖是一個示範畫面。它顯示了一個雪人和一些經過billboard處理過的樹。雖然很難說這些樹就是嚴格面朝相機的,但是它們确實面向了與相機視線垂直的一個平面。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauQXYlh2YsxWai9CXn5WakJXYvJGbslmYvwFbn5WZw92Lc12bj5CZzU2c19Ga0h2ZpxmL3d3dvw1LcpDc0RHaiojIsJye.jpg)
下面的圖表更加清晰的反映了這種關系。位于底部的黑色圓點代表相機。由相機發出的矢量箭頭表示了相機目前的視線方向。同時這個矢量也确定了一個與相機視線方向垂直的平面。圖中的物體01,02,03被旋轉使得它們的正面矢量朝着這個平面。這裡假設所有物體都被置于圓點并且面向Z軸的正方向。
為了實作這一效果需要擷取模型視圖矩陣。首先你應該知道模型視圖矩陣存儲了幾何圖形的變換包括旋轉,縮放和平移。這個矩陣包含了所有需要的變換,通過這些變換将你輸入的坐标和世界坐标轉換為相機坐标。
矩陣的第四列的上面3個值代表了關于相機位置和方向的本地原點的位置。上面的3X3子矩陣包含了縮放和旋轉操作。将這個子矩陣置為機關矩陣可以有效的将這些操作屏蔽,以便使相機的視線方向與世界坐标系Z軸方向一緻。相機的向上和向右矢量也和世界坐标系一緻,也就是說這種billboard方式是一種僞球形billboarding.這個billboard的中心是原點。如果你打算使用這種billboarding方式,那麼當使用者向上或向下看時樹好像在向前或向後彎曲,這多少會有些尴尬。這是因為billboard的定向依賴于和相機位置相反的相機方向。
實際上,将子矩陣置為機關矩陣意味着你所繪制的物體不會發生任何旋轉。是以,如果相機視線對着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();
上面的代碼段可以使物體旋轉至面朝相機視線垂直的平面,旋轉的中心為坐标原點。