(1)枚舉默認為unsigned int類型,我們可以手動為枚舉指定類型,如:
enum Attr : char
{
ATTR_LV = 120 ,
};
(2)我們可以使用泰勒展開式快速計算兩點間距離:
?
int fastDistance2D( int _nX1, int _nY1, int _nX2, int _nY2 )
{
// this function computes the distance from _nX1, _nY1 to _nX2, _nY2 with 3.5% error
// first compute the absolute value of (_nX2 - _nX1), (_nY2 - _nY1)
int x = abs( _nX2 - _nX1 );
int y = abs( _nY2 - _nY1 );
// compute the minimum of x,y
int nMin = min( x, y );
// return the distance
return ( x + y - (nMin >> 1 ) - (nMin >> 2 ) + (nMin >> 4 ) );
}
float fastDistance3D( float _fX1, float _fY1, float _fZ1,
float _fX2, float _fY2, float _fZ2 )
{
// this function computes the distance from the _fX1, _fY1, _fZ1 to _fX2, _fY2, _fZ2
// make sure values are all positive
int x = static_cast< int >( fabs(_fX2 - _fX1) * 1024 );
int y = static_cast< int >( fabs(_fY2 - _fY1) * 1024 );
int z = static_cast< int >( fabs(_fZ2 - _fZ1) * 1024 );
// sort values
int nTemp = 0 ;
if ( y < x )
{
nTemp = x;
x = y;
y = nTemp;
}
if ( z < y )
{
nTemp = y;
y = z;
z = nTemp;
}
if ( y < x )
{
nTemp = x;
x = y;
y = nTemp;
}
//////////////////////////////////////////////////////////////////////// //
// compute distance with 8% error
int dist = ( z + 11 * (y >> 5 ) + (x >> 2 ) );
return ( static_cast< float >(dist >> 10 ) );
}
(3)sinx的泰勒級數表示如下:
?cosx的泰勒級數表示如下:
理想情況下,這些級數將是無限延伸的以達到最大的精確性,但是我們需要根據特定情況使用有限項來計算精確的結果,使用1到4項的sinx泰勒級數如下:
當x的值離原點越遠,我們就需要越多的項來計算精確的結果。一般來說,4項對于我們來說足夠了,因為sinx是以2pi為周期的函數,因此我們可以把任意的x的值規范到-pi ~ pi之間再進行計算。
(4)可以用柱坐標或球坐標將點從極坐標系轉換到笛卡爾坐標系中,如圖:
(5)在著色器中計算頂點顏色時,雖然著色器中所有的值都是浮點數,但在頂點顏色離開著色器時,它會被裁剪到范圍0~1,并且受制于頂點顏色的格式。舉例來說,如果頂點顏色的格式是32位的,那么顏色的每個分量只能保存8位即256種不同的值。這也就是說,在0~1之間只存在256種不同的值,所以,當顏色的變換小于1/256時,將會出現偏差,如圖:
有許多辦法可以解決這個問題,例如將數據分別存在多個分量中,最終再重新組合?;蛘邔祿嫒爰y理坐標中,然后從一個預先定義的紋理中取出最終的數據等等。
(6)當我們使用非均勻的縮放矩陣變換物體時,必須注意物體法線的變換問題,如圖:
其中(a)表示原始的法線,(b)表示將非均勻的縮放矩陣變換應用到法線上,此時我們發現法線不再垂直于表面,(c)表示應用正確的變換矩陣到法線上,法線變換后仍繞垂直于表面。
這個正確的變換矩陣就是應用于物體的變換矩陣的逆轉置矩陣。
現假設A矩陣是應用到物體的世界變換矩陣,u向量代表頂點切線,n向量代表頂點法線,我們知道有:
然后我們把點積寫成向量乘矩陣的形式:
之后插入單位矩陣:
進行適當的組合:
把后面的項進行轉置操作:
再把向量乘矩陣寫成點積形式:
最后我們得到了A的逆轉置矩陣可以正確的變換法線。
(7)相對于2D紋理坐標,在立方體映射中我們使用一個從立方體原點發射的3D向量作為紋理坐標,立方體的某一面與該3D向量的交點即是我們所要采集的紋理元素。
現假設該3D向量為v(-3, -1, 2),由于x坐標是最大的值(絕對值大小),所以該3D向量肯定與立方體的x軸負方向的面相交,同理,如果v(-1, 4, 2),那么肯定與立方體的y軸正方向的面相交?,F在,我們將該3D向量的另外2個分量除以最大的那個分量的絕對值,即(-1, 2) / |-3| = (-1/3, 2/3),這樣將產生[-1, 1]之間的坐標值,為了求得正確的紋理坐標值,我們再將結果規范化到[0, 1]之間,即1/2(-1/3 + 1, 2/3 + 1) = (0.33, 0.83),這樣,就求得了用于從相交面采集紋理元素的2D紋理坐標。
(8)平面方程為Ax + By + Cz = D,其中,A,B,C表示平面法線的3個分量,D表示平面到原點的有向距離。假設我們現在有P1,P2,P3點,要求這3個點所在的平面方程,我們可以先求兩兩點之間的向量,如圖:
然后,我們只需要隨意取V1,V2,V3向量中的2個進行叉積,我們就可以得到平面的法線,這里要注意叉積的順序問題。
接著,我們把求得的法線的3個分量分別代入A,B,C,然后,隨意取P1,P2,P3中的一點代入平面方程,就可以求得D?;具^程如下:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
