3D游戏从入门到精通-7

时间:2022-03-05 23:03:17
 
1、             世界坐标变换矩阵
在设置顶点缓冲区之后,就需要设置物体的世界坐标变换矩阵。从解析几何里可以知道,无论二维还是三维的图像都可以通过齐次坐标来变换的。目前在三维里的变换,采用的矩阵是4×4的矩阵来实现变换处理。在D3D里定义D3DXMATRIX类型,使用它来表达一个矩阵,并且定义一系列的函数可以实现矩阵的运算。它的定义如下:
 
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;
上面代码定义了4×4矩阵的四个元素,全部使用浮点数运算。接着还添加了一些操作方法,如下:
typedef struct D3DXMATRIX : public D3DMATRIX
{
public:
    D3DXMATRIX() {};
    D3DXMATRIX( CONST FLOAT * );
    D3DXMATRIX( CONST D3DMATRIX& );
    D3DXMATRIX( CONST D3DXFLOAT16 * );
    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 );
 
 
    // access grants
    FLOAT& operator () ( UINT Row, UINT Col );
    FLOAT operator () ( UINT Row, UINT Col ) const;
 
    // casting operators
    operator FLOAT* ();
    operator CONST FLOAT* () const;
 
    // assignment operators
    D3DXMATRIX& operator *= ( CONST D3DXMATRIX& );
    D3DXMATRIX& operator += ( CONST D3DXMATRIX& );
    D3DXMATRIX& operator -= ( CONST D3DXMATRIX& );
    D3DXMATRIX& operator *= ( FLOAT );
    D3DXMATRIX& operator /= ( FLOAT );
 
    // unary operators
    D3DXMATRIX operator + () const;
    D3DXMATRIX operator - () const;
 
    // binary operators
    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;
 
上面的方法,都是对这个矩阵的运算,使用起来更加方便。
有了矩阵的定义,还有了矩阵的运算,那么构造一个从模型坐标到世界坐标变换的矩阵,就是很容易的事情了。由于我不需要变换它,直接使用一个单位矩阵,就可以了。由单位矩阵可知,任何数据乘以单位矩阵都不变会改变。代码如下:
 
// 设置世界坐标矩阵。
D3DXMATRIX matIdentity;
D3DXMatrixIdentity( &matIdentity );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matIdentity );
 
这段代码里先定义一个矩阵,然后调用函数D3DXMatrixIdentity初始化这个矩阵为单位矩阵,最后通过函数SetTransform设置为世界坐标变换矩阵。
这样显示的三角形就是按模型坐标系显示到世界坐标系里,也就是在世界坐标系的原点位置显示。
在游戏里,所有3D模型都是在外面做好的,因此都是模型坐标系,也就是局部坐标系,要把它们显示到世界坐标系里,一般是需要通过变换的。因为所有模型坐标系都是相同的,都是原点在世界坐标系的原点。如果不通过变换就显示的话,所有的物体都是重叠在原点位置,这样就分不清楚它们的显示。比如显示一个足球场,两个球门就是分别显示的。一个球门在原点,一个球门就在离原点一段距离再显示,还需要通过合适旋转变换才能显示。由于两个球门是同一个局部坐标系的物体构成,必须通过世界坐标变换矩阵才能显示出来。
 
 
 
电子书 MM3D 引擎源程序 例子源程序 49 元一套
联系人:蔡军生  
联系方式:
QQ: 9073204
EMAIL: caimouse1976 at sina.com