您的位置:首页 > 其它

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

2006-08-11 00:15 323 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: