左手坐标系:左手4个手指的旋转方向从x轴到y轴,大拇指指向的方向就是z轴方向。

  右手坐标系右手4个手指的旋转方向从x轴到y轴,大拇指指向的方向就是z轴方向。

                                      

 

  三角形图示

            

  坐标变换:

 

  世界变换:

    我们在建立三维实体的数学模型时,通常以实体的某一点为坐标原点,比如一个球体,很自然就用球心做原点,这样构成的坐标系称为本地坐标系(Local Coordinates)。实体总是位于某个场景(World Space)中,而场景采用世界坐标系(World Coordinates),如图8所示,因此需要把实体的本地坐标转换成世界坐标,这个变换称为世界变换(World Transformation)。

    在Direct3D中,坐标变换通过一个4*4矩阵来实现,对于世界变换,只要给出实体在场景中的位置信息,就可以借助Direct3D函数得到变换矩阵,具体的计算步骤如下:

  1、首先把实体放置在世界坐标系原点,使两个坐标系重合:

  2、在世界空间中,对实体进行平行移动,其对应的平移变换阵TT以由函数D3DXMatrixTranslation求得:

  3、把平移后的实体沿自身的Z轴旋转一个角度(角度大于0,表示从Z轴的正向朝原点看去,旋转方向为顺时针;反之为逆时针,下同),对应的旋转变换阵TZ用D3DXMatrixRotationZ计算;

  4、把实体沿自身的Y轴旋转一个角度,用D3DXMatrixRotationY求出变换阵TY;

  5、把实体沿自身的X轴旋转一个角度,用D3DXMatrixRotationX求出变换阵TX;

  6、最后对实体进行缩放,假设三个周德缩放系数分别为SX,SY,SZ,该操作对应的变换阵TS可以由D3DXMartixScaling求得;

  7、最终的世界变换矩阵TW=TS*TX*TY*TZ*TT,在Direct3D中,矩阵乘法用函数D3DXMatrixMultiply实现,注意相乘顺序为操作的逆序。

 

  视角变换

  实体确定后,接下来要确定观察者在世界坐标系中的方位,换句话说,就是在世界坐标系中如何防止摄像机。观察者(摄像机)所看到的景象,就是Direct3D窗口显示的内容。

  确定观察者需要3个量:

  1、观察者的点坐标;

  2、视线方向,为一个矢量,不过Direct3D用视线上的一个点来代替,此时视线方向就是从观察者指向该目标点,这样表示更直观一些;

  3、上方向,通俗说,就是观察者的头顶方向,用一个矢量表示。

  确定后,以观察者为原点,视线为Z轴,上方向或它的一个分量为Y轴(X轴可由左手法则得出,为右方向),构成了视角坐标系,如下图所示。我们需要把实体从世界空间转换到视角空间,这个坐标变换称为视角变换(View Transformation)。

      

  与世界变换相比,视角变换矩阵的获取要容易得多,只需要调用一个函数D3DXMatrixLookAtLH,其输入参数就是决定观察者的那三个量。

 

  投影变换

  实体转换到视角空间后,还要经过投影变换(Projection Transformation),三维的实体才能显示在二维的计算机屏幕上,打个比方,如果把屏幕看做照相机中的胶卷,那么投影变换就能相当于照相机的镜头。

  Direct3D使用透视投影变换(Perspective Transformation),此时在视角空间中,可视区域是一个以视线为轴心的棱台(Viewing Frustum),如下图所示。想象一下你处在一个深受不见五指的房间里,面前有一扇窗户,你可以透过窗户看到各种景物。窗户就是棱台的前裁剪平面,天空、远山等背景是后裁剪平面,由于采用透视投影,距离观察者的对象会变小,从而更具有真实感。在Direct3D中,前裁剪平面被映射到程序窗口,最终形成了我们在屏幕上看到的画面。

 

                 

 

  透视投影变换由4个量决定:

  1、前裁剪平面的宽度w;

  2、前裁剪平面的高度h;

  3、前裁剪平面到原点的距离z1;

  4、后裁剪平面到原点的距离z2。

  由于w、h用起来不是很直观,因此实际应用中,常用fov和aspect代替w、h,其中fov是Y方向上的可视角度,通常取Pi/4;aspect是前裁剪平面的高度与宽度之比,通常取1,(由三角函数定义,易知h = 2*z1*tg(fov/2),w = h/aspect)。用这4个量来调用函数D3DXMatrixPerspectiveFovLH,即可获得投影变换矩阵。

  得到3个变换矩阵后,还需要调用方法IDirect3DDevice9::SetTransform把他们设置到渲染环境中,具体用法见后面的例程。

  最后,可以用三句话来概括这些变换的作用:世界变换决定实体的位置;视角变换决定观察者的位置;投影变换决定观察者的可视区域。

  至此,相关的数学部分终于讲完了。