LearningRecords

系统 1459 0

(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泰勒级数如下:

LearningRecords

当x的值离原点越远,我们就需要越多的项来计算精确的结果。一般来说,4项对于我们来说足够了,因为sinx是以2pi为周期的函数,因此我们可以把任意的x的值规范到-pi ~ pi之间再进行计算。

(4)可以用柱坐标或球坐标将点从极坐标系转换到笛卡尔坐标系中,如图:

LearningRecords

(5)在着色器中计算顶点颜色时,虽然着色器中所有的值都是浮点数,但在顶点颜色离开着色器时,它会被裁剪到范围0~1,并且受制于顶点颜色的格式。举例来说,如果顶点颜色的格式是32位的,那么颜色的每个分量只能保存8位即256种不同的值。这也就是说,在0~1之间只存在256种不同的值,所以,当颜色的变换小于1/256时,将会出现偏差,如图:

LearningRecords

有许多办法可以解决这个问题,例如将数据分别存在多个分量中,最终再重新组合。或者将数据存入纹理坐标中,然后从一个预先定义的纹理中取出最终的数据等等。

(6)当我们使用非均匀的缩放矩阵变换物体时,必须注意物体法线的变换问题,如图:

LearningRecords

其中(a)表示原始的法线,(b)表示将非均匀的缩放矩阵变换应用到法线上,此时我们发现法线不再垂直于表面,(c)表示应用正确的变换矩阵到法线上,法线变换后仍绕垂直于表面。

这个正确的变换矩阵就是应用于物体的变换矩阵的逆转置矩阵。

现假设A矩阵是应用到物体的世界变换矩阵,u向量代表顶点切线,n向量代表顶点法线,我们知道有:

然后我们把点积写成向量乘矩阵的形式:

之后插入单位矩阵:

进行适当的组合:

把后面的项进行转置操作:

再把向量乘矩阵写成点积形式:

最后我们得到了A的逆转置矩阵可以正确的变换法线。

(7)相对于2D纹理坐标,在立方体映射中我们使用一个从立方体原点发射的3D向量作为纹理坐标,立方体的某一面与该3D向量的交点即是我们所要采集的纹理元素。

现假设该3D向量为v(-3, -1, 2),由于x坐标是最大的值(绝对值大小),所以该3D向量肯定与立方体的x轴负方向的面相交,同理,如果v(-1, 4, 2),那么肯定与立方体的y轴正方向的面相交。现在,我们将该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个点所在的平面方程,我们可以先求两两点之间的向量,如图:

LearningRecords

然后,我们只需要随意取V1,V2,V3向量中的2个进行叉积,我们就可以得到平面的法线,这里要注意叉积的顺序问题。

接着,我们把求得的法线的3个分量分别代入A,B,C,然后,随意取P1,P2,P3中的一点代入平面方程,就可以求得D。基本过程如下:

LearningRecords

LearningRecords


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论