• DirectX9:先导篇 数学基础


    一.左手系坐标和右手系坐标

    左手系坐标和右手系坐标的X轴和Y轴都是分别指向右边和上边的,唯一的区别在于手指中指指向的方向,一个是朝着屏幕,一个是朝着我们自己.

    二.向量

    点是三维空间中的一个坐标,它的值是参照原点绝对的

    向量是表示方向和大小的三个分量,与位置距离无关,它是相对于参考点的

    1.向量的表示

    (1)3D向量
    // 向量结构体
     
    #ifndef D3DVECTOR_DEFINED
    typedef struct _D3DVECTOR {
        float x;
        float y;
        float z;
    } D3DVECTOR;
    #define D3DVECTOR_DEFINED
    #endif
    
    // 向量类
     
    #ifdef __cplusplus
    typedef struct D3DXVECTOR3 : public D3DVECTOR
    {
    public:
        D3DXVECTOR3() {};
        D3DXVECTOR3( CONST FLOAT * );
        D3DXVECTOR3( CONST D3DVECTOR& );
        D3DXVECTOR3( CONST D3DXFLOAT16 * );
        D3DXVECTOR3( FLOAT x,FLOAT y,FLOAT z );
     
        //casting
        operator FLOAT* ();
        operator CONST FLOAT* () const;
     
        D3DXVECTOR3& operator += ( CONST D3DXVECTOR3& );
        D3DXVECTOR3& operator -= ( CONST D3DXVECTOR3& );
        D3DXVECTOR3& operator *= ( FLOAT );
        D3DXVECTOR3& operator /= ( FLOAT );
     
        D3DXVECTOR3 operator + () const;
        D3DXVECTOR3 operator - () const;
     
        D3DXVECTOR3 operator + ( CONST D3DXVECTOR3& ) const;
        D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const;
        D3DXVECTOR3 operator * ( FLOAT ) const;
        D3DXVECTOR3 operator / ( FLOAT ) const;
     
        friend D3DXVECTOR3 operator * ( FLOAT, CONST struct D3DXVECTOR3& );
     
        BOOL operator == ( CONST D3DXVECTOR3& ) const;
        BOOL operator != ( CONST D3DXVECTOR3& ) const;
     
    } D3DXVECTOR3, *LPD3DXVECTOR3;
     
    #else
    typedef struct _D3DVECTOR D3DXVECTOR3, *LPD3DXVECTOR3;
    #endif
    
    (2)2D向量
    (3)4D向量

    2.向量判断

    D3DXVECTOR u(1.0f,0.0f,1.0f);
    D3DXVECTOR v(0.0f,1,0f,0.0f);
     
    if(u==v)
     
    if(u!=v)
     
    // 比较浮点数,相差很小精度
    bool Equals(float lhs,float rhs)
    {
        return fabs(lhs - rhs) < EPSILON ? true : false;
    }
    

    3.计算向量的长度

    || u ||表示向量u的长度,计算向量u = (1,2,3)和v = (1,1)的长度

    (1)D3DXVec3Length()
    FLOAT D3DXVec3Length(
        CONST D3DXVECTOR3* pV;
    );
     
    D3DXVECTOR3 v(1.0f, 2.0f, 3.0f);
    float magnitude = D3DXVec3Length( &v );  //相当于sqrt(),求模得14
    

    4.向量的规范化

    向量的规范化就是让向量的模变为1,即变为单位向量

    将向量u=(1,2,3) 和v = (1,1)规范化

    (1)D3DXVec3Normalize()
    D3DXVECTOR3 *D3DXVec3Normalize(
        D3DXVECTOR3* pOut;
        CONST D3DXVECTOR3* pV;
    );
    

    5.向量的加减

    向量的加减必须在两个向量的向量维数一致下进行

    坐标轴意义:向量的加减其实就是根据原点对向量做两次平移的操作

    D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);
    D3DXVECTOR3 v(0.0f, -1.0f, 5.0f);
     
    // (2.0 + 0.0, 0.0 + (-1.0), 1.0 + 5.0)
     
    D3DXVECTOR3 sum = u + v;  // = (2.0f, -1.0f, 6.0f)
    

    D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);
    D3DXVECTOR3 v(0.0f, -1.0f, 5.0f);
     
    D3DXVECTOR3 difference = u - v;    // = (2.0f, 1.0f, -4.0f)
    

    6.向量的数乘

    标量可以与向量相乘,

    坐标轴意义:该运算是对向量进行缩放

    D3DXVECTOR3 u(1.0f, 1.0f, -1.0f);
    D3DXVECTOR3 scaledVec = u * 10.0f;  // =(10.0f, 10.0f, -10.0f)
    

    7.向量的点乘

    点乘就是两个向量的乘积

    u * v = | u | | v | cosθ  表示两个向量的点乘是它们的模和夹角的余弦之和

    (1)D3DXVec3Dot()
    D3DXVECTOR3 u(1.0f, -1.0f, 0.0f);
    D3DXVECTOR3 v(3.0f, 2.0f, 1.0f);
     
    // (1.0*3.0)+(-1.0f*2.0f)+(0.0*1.0)
     
    float dot = D3DXVec3Dot( &u, &v );  // =1.0
    

    8.向量的叉乘

    点乘求出的是一个标量

    叉乘求出的是另一个向量,这一个向量垂直于另外两个向量

    (1)D3DXVec3Cross()

    D3DXVECTOR3* D3DXVec3Cross(

        D3DXVECTOR3* pOut,

        CONST D3DXVECTOR3* pV1,

        CONST D3DXVECTOR3* pV2

    );

    9.点和向量变换

    D3DXVECTOR3* D3DXVec3TransformCoord(

        D3DXVECTOR3* pOut,

        CONST D3DXVECTOR3* pV,

        CONST D3DXMATRIX* pM

    );

    D3DXVECTOR3* WINAPI D3DXVec3TransformNormal(

        D3DXVECTOR3* pOut,

        CONST D3DXVECTOR3* pV,

        CONST D3DXMATRIX* pM

    );

    三.矩阵

    1.矩阵的表示

    在D3DX中表示4*4的矩阵,因为3*3的矩阵不能实现所有变换,比如平移 投影 反射等

    1*4的矩阵表示行向量

     (1)D3DMATRIX结构体

    typedef struct _D3DMATRIX {
     
        union {
            struct {
                float    _11, _12, _13, _14;
                float    _21, _22, _23, _24;
                float    _31, _32, _33, _34;
                float    _41, _42, _43, _44;
            };
            float m[4][4];
        };
     
    } D3DMATRIX;

    (2)D3DXMATRIX类

    typedef struct D3DXMATRIX : public D3DMATRIX {
    public:
        D3DXMATRIX() {};
        D3DXMATRIX( CONST FLOAT* );
        D3DXMATRIX( CONST D3DMATRIX& );
        D3DXMATRIX( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,
                    FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,
                    FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,
                    FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 );
     
        FLOAT& operator () ( UINT Row, UINT Col );
        FLOAT& operator () ( UINT Row, UINT Col ) const;
     
        operator FLOAT* ();
        operator cONST FLOAT* () const;
     
        D3DXMATRIX& operator *= ( CONST D3DXMATRIX& );
        D3DXMATRIX& operator += ( CONST D3DXMATRIX& );
        D3DXMATRIX& operator -= ( CONST D3DXMATRIX& );
        D3DXMATRIX& operator *= ( FLOAT );
        D3DXMATRIX& operator /= ( FLOAT );
     
        D3DXMATRIX operator + () const;
        D3DXMATRIX operator - () const;
       
        D3DXMATRIX operator * ( CONST D3DXMATRIX& ) const;
        D3DXMATRIX operator + ( CONST D3DXMATRIX& ) const;
        D3DXMATRIX operator - ( CONST D3DXMATRIX& ) const;
        D3DXMATRIX operator * ( FLOAT ) const;
        D3DXMATRIX operator / ( FLOAT ) const;
        friend D3DXMATRIX operator * ( FLOAT, CONST D3DXMATRIX& );
        BOOL operator == ( CONST D3DXMATRIX& ) const;
        BOOL operator != ( CONST D3DXMATRIX& ) const;
    } D3DXMATRIX, *LPD3DXMATRIX;
     

    2.矩阵相加减

    两个矩阵的维数相同时才能把它们相加减

    3.矩阵数乘

    4.矩阵相乘

    A的列数必须等于B的行数才能矩阵相乘

    5.单位矩阵

    单位矩阵除了对角(斜对角线)以外所有成员都是0

    单位矩阵乘以任何矩阵都不会改变矩阵,相当于1

    (1)D3DXMatrixIdentity()

    D3DXMATRIX* D3DXMatrixIdentity(

        D3DXMATRIX* pout

    );

    D3DXMATRIX M;
    D3DXMatrixIdentity(&M);
    

    6.逆矩阵

    矩阵之中并没有除法运算

    只有方矩阵(正方形矩阵)才能求逆

    矩阵和它的逆矩阵相乘得到单位矩阵

    (1) D3DXMatrixInverse()

    D3DXMATRIX* D3DXMatrixInverse(

        D3DXMATRIX* pOut,

        FLOAT* pDeterminant,

        CONST D3DXMATRIX* pM

    );

    7.转置矩阵

    矩阵的转置就是相互交换矩阵的行和列

    (1)D3DXMatrixTranspose()

    D3DXMATRIX* D3DXMatrixTranspose(

        D3DXMATRIX* pOut,

        CONST D3DXMATRIX* pM

    );

    D3DXMATRIX A(...);
    D3DXMATRIX B;
    D3DXMatrixTranspose(&B, &A);
    

    五.基本变换

    1.平移矩阵

    通过以下的矩阵相乘把向量(x,y,z,1)沿着x轴移动Px个单位,沿着y轴移动Py个单位,沿着z轴移动Pz个单位

    向量多加一个维度,1表示可以变换,0表示禁止变换

    (1)D3DXMatrixTranslation()

    D3DXMATRIX* D3DXMatrixTranslation(

        D3DXMATRIX* pOut,

        FLOAT x,

        FLOAT y,

        FLOAT z

    );

    2.旋转矩阵

    角度是顺时针的方向

    (1)沿X轴旋转

     D3DXMATRIX* D3DXMatrixRotationX(

        D3DXMATRIX* pOut,

        FLOAT Angle

    );

    (2)沿Y轴旋转

    D3DXMATRIX* D3DXMatrixRotationY(

        D3DXMATRIX* pOut,

        FLOAT Angle

    );

    (3)沿Z轴旋转

    D3DXMATRIX* D3DXMatrixRotationZ(

        D3DXMATRIX* pOut,

        FLOAT Angle

    );

    3.缩放矩阵

    通过以下的矩阵相乘把向量沿X轴缩放Qx个单位,沿Y轴缩放Qy个单位,沿Z轴缩放Qz个单位

    (1)D3DXMatrixScaling()

    D3DXMATRIX* D3DXMatrixScaling(

        D3DXMATRIX* pOut,

        FLOAT sx,

        FLOAT sy,

        FLOAT sz

    );

  • 相关阅读:
    javascript 中的 parameter vs arguments
    5款免费开源自建私人云盘程序 实现网盘自建数据自我掌控
    CentOS 7下安装Nextcloud搭建个人网盘
    centos7升级自带的php5.4版本到php5.6
    docker的介绍以及常用命令
    docker-ce的安装以及卸载
    CentOS7安装weblogic集群思路梳理
    centos7修改静态ip地址
    Windows server 2008启动remote dosktop services服务报错1079
    Centos 7.x 安装配置tomcat-8过程梳理
  • 原文地址:https://www.cnblogs.com/k5bg/p/11149398.html
Copyright © 2020-2023  润新知