zoukankan      html  css  js  c++  java
  • LearningRecords

    (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时,将会出现偏差,如图:

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

    (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轴正方向的面相交。现在,我们将该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。基本过程如下:

  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/twjcnblog/p/2203059.html
Copyright © 2011-2022 走看看