美文网首页
DX笔记-现在有点饿了

DX笔记-现在有点饿了

作者: 我原来还有这个账号 | 来源:发表于2017-04-27 09:53 被阅读0次

    DirectX9.0

    基础知识:用类D3DXVETOR3表示3D空间中的向量

    1.向量相等:

    const float EPSILON = 0.001f;
    bool Equals(float lhs, float rhs)
    {
       return fbs(lhs-rhs)< EPSILON ? true : false;
    }
    

    2.计算向量的模:

    float D3DXVec3Length(const DDXVECTOR3 * pV); // 原型
    D3DXVECTOR3 v(1.f,2.0f,3.f);
    float magnitude = D3DXVec3Length(&v);
    

    3.向量的规范化:

    D3DXVECTOR3M* D3DXVec3Normalize(
           D3DXVECTOR3 * pOUT,    //结果
           const D3DVECTOR3 * pV);    //要求的向量指针
    

    4.向量加法:只有维数相同的两个向量才能相加
    重载加法运算符(+)
    D3DXVECTOR3 sum = u + v;

    5.向量减法:
    重载减法运算符(-)
    D3DXVECTOR3 different = u - v;

    6.数乘:
    D3DXVECTOR3 scaledVec = u*10.0f;

    7.点积:

    float D3DXVec3Dot(
        const D3DXVECTOR3 * pV1,
        const D3DXVECTOR3* pV2);  // 原型
    float dot = D3DXVec3Dot(&u , &v);
    

    8.叉积:
    可以借助左手法则来判断叉积的方向

    D3DXVECTOR3 *D3DXVec3Cross(
           D3DXVECTOR3 *pOUT,     //结果
           const D3DXVECTOR3 *pV1,
           const D3DXVECTOR3 *pV2);
    

    9.矩阵:

    D3DXMATRIX M;
    M(0,0) = 0.5f; // 括号运算符
    
    D3DXMATRIX *D3DXMatrixIdentity(
           D3DXMATRIX *pout); // 单位矩阵
    
    D3DXMATRIX *D3DXMatrixTranspose(
           D3DXMATRIX *pout,  // 转置结果
           const D3DXMATRIX *pM);  // 需要转置的矩阵
    
    D3DXMATRIX *D3DXMatrixInverse(
           D3DXMATRIX *pout, // 求逆的结果
           float *pDeeterminant,
           const D3DXMATRIX *pM);  // 要求逆的矩阵
    D3DXMATRIX A(...);
    D3DXMATRIX B;
    D3DXMatriInverse(&B , 0 , &A);
    

    10.平移矩阵:

    D3DXMATRIX *D3DXMatrixTranslation(
           D3DXMATRIX *pout,  // 结果
           float x,  // 沿x轴平移的量
           float y,  // 沿y轴平移的量
           float z);  // 沿z轴平移的量
    

    11.旋转矩阵:

    // 沿X轴旋转
    D3DXMATRIX *D3DXMatriRotationX(
           D3DXMATRIX *pout,
           float Angle);
     // 沿Y轴旋转
    D3DXMATRIX *D3DXMatriRotationY(
           D3DXMATRIX *pout,  
           float Angle);
    // 沿Z轴旋转
    D3DXMATRIX *D3DXMatriRotationZ(
           D3DXMATRIX *pout,
           float Angle);
    

    旋转矩阵R的逆矩阵与其转置相等,具备这样特点的矩阵称为正交矩阵。

    12.比例变换矩阵

    D3DXMATRIX *D3DXMatrixScaling(
           D3DXMATRIX *pout,   // 结果
           D3DXMATRIX sx,       // x轴的变换比例
           D3DXMATRIX sy,       // y轴的变换比例
           D3DXMATRIX sz);     // z轴的变换比例
    

    13.向量和点的变换

    // 对点进行变换,并假定向量的第4个分量为1
    D3DXVECTOR3 *D3DXVec3TransformCoord(
           D3DXVECTOR3*pout,
           CONST D3DXVECTOR3 *pV,
           CONST D3DXMATRIX *pm);
    // 对向量进行变换,并假定向量的第4个分量为0
    D3DXVECTOR3 *D3DXVec3TransformNormal(
           D3DXVECTOR3 *pout,
           CONST D3DXVECTOR3 *pV,
           CONST D3DXMATRIX *pM);
    

    14.COM(组件对象模型)
    创建COM接口时不可使用C++关键字new。使用完一个接口应调用该接口相应的Release方法。
    COM接口都有一个前缀1.

    15.表面
    表面是Direct3D主要用于存储2D图像数据的一个像素矩阵。本质上是一个线性数组。
    宽度(width)和高度(height)都用像素来度量,跨度(pitch)用字节来度量。

    // _surface是一个IDirect3DSurface9 interface的指针
    // 获得当前表面的描述信息
    D3DSURFACE_DESC sufaceDesc;
    _surface->GetDesc(& surfaceDesc);
    
    // 得到一个指向表面像素数据的指针
    D3DLOCKED_RECT lockedRect;
    _surface->LockedRect(
           & lockedRect,   // 指向获得的数据指针
           0,                      // 指向整个表面
           0);                    // 没有指向的标志
    
    // 循环访问表面上的每个像素并将其标红
    DWORD * imageData = (DWORD *)lockedRect.pBits;
    for(int i = 0; i < surfaceDesc.Height ; i++)
    {
       for(int j=0; j<surfaceDesc.Width; j++)
          {
             // index into texture, note we use the pitch and divide by four
             // since the pitch is given in bytes and there are 4 bytes per DWORD
             int index = i * lockedRect.Pitch / 4 + j;
             imagedata[index] = 0xffff0000;  // 标红
           }
    }
    _surface->UnlockedRect(); 
    

    相关文章

      网友评论

          本文标题:DX笔记-现在有点饿了

          本文链接:https://www.haomeiwen.com/subject/jxdgzttx.html