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

时间:2022-03-05 23:02:53
 
2.10.1坐标系
在D3D里使用的坐标系是左手坐标系,就是当你看屏幕时,左手边是X轴的负方向,右手边是X轴的正方向。屏幕下边是Y轴的负方向,屏幕上边是Y轴的正方向。远离屏幕是Z轴的负方向,指向屏幕里面是Z轴的正方向。
坐标系还有右手坐标系,还有其它各种各样的坐标系。如果需要从其它坐标里的图形显示在D3D里,就需要进行转换。
2.10.2
在三维空间里表示物体位置,就需要用坐标来表示。由上面的坐标系可知,任何一点,都可以用三个坐标轴的值来表示。比如表示零点,就是 O 0 0 0 )。只要给出三个坐标轴的值,就可以知道这个点在什么位置了。
从坐标系里,就知道我们定义的坐标轴是有方向的。那么在坐标系里的点,是否也有方向呢?为了表示方便,使用起来简单,在 D3D 里的点也是有方向的。用向量来表一个点的位置和方向。一个点的方向,都是从原点出发指向这点的方向。比如下面的图中, OA 就是一个点的位置和方向。
从几何上知道这种表示方法了,但在程序里是怎么样表示一个向量呢?在编程里,是需要特定的编程语言来表达向量的。由于 C ++具有强大的功能和特别快的处理速度,目前大部份游戏都是采用 C ++来编写。因此 D3D 游戏也不例外地采用 C ++。如果你还不会使用 C ++,建议你先去找本 C ++的书来看看,然后再接着看本书,否则很多东西是看不懂的。
C ++里是使用结构( struct )或者类 (class) 来表达一个向量的。下面就是 D3D 里的向量表示方法:
typedef struct _D3DVECTOR {
    float x;
    float y;
    float z;
} D3DVECTOR;
D3DVECTOR 向量定义了三个成员 x,y,z 来表示坐标系三个坐标轴的值。这里使用 typedef 来定义向量类型,以后就可以使用它来定义其它向量类型变量了。为了方便对它的操作,因此又需要继承它,生成一个新类 D3DXVECTOR3 D3DXVECTOR3 类有很多方法,使用起来非常方便。因而在程序里,主要使用它来定义变量,这样就有很函数可以使用了。比如赋值,相加,相减等等。它的定义如下:
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;
 
    // assignment operators
    D3DXVECTOR3& operator += ( CONST D3DXVECTOR3& );
    D3DXVECTOR3& operator -= ( CONST D3DXVECTOR3& );
    D3DXVECTOR3& operator *= ( FLOAT );
    D3DXVECTOR3& operator /= ( FLOAT );
 
    // unary operators
    D3DXVECTOR3 operator + () const;
    D3DXVECTOR3 operator - () const;
 
    // binary operators
    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;
 
在这里已经实现向量的加减、数乘、数除,也许你发现这里有没有点积和叉积运算。它们是通过其它公共函数实现的。说到这里,如果你对点积和叉积运算不是很懂,看来又需要去看看《向量代数》了。在游戏里,要表示一个人沿着 OA 的方向行走,那么只需要对着 OA 向量数乘,就可以了。有了这样的向量类型定义,就可像下面那样方便使用:
D3DXVECTOR3 vOA(1.0f,1.0f,1.0f);