在前面的章節已經說到過,在固定管線中,第一步動作便是對圖元做座標變換。所謂圖元(primtive),就是一堆頂點,這些頂點構成了特定的幾何形狀,這就叫做圖元。
所以,我們做變換的對象說到底,就是頂點。
在固定管線中,變換分成2個步驟:
局部座標繫到全局座標系 和 全局座標繫到觀察座標系。
局部座標系:就是建模座標系,它是在建模時由3DMAX之類的工具定義的;
全局座標系:用來統一情境中各個object的位置、尺寸等規格;
觀察座標系:也就是攝像機的座標系。
局部座標繫到全局座標系變換:
這個變換是為了把在不同建模工具或者有用不同規格的建模尺寸下設計的模型,都統一到一個通用的座標系下面。這個動作的作用,就像秦始皇統一度量衡一樣。從局部座標繫到全局座標系 這個變換的動作,通常是在遊戲設計時,由 遊戲工具(如:情境編輯器)來預先計算,並且為每個模型都計算出一個變換矩陣(即 記錄模型在遊戲情境中的 大小、朝向、位置),叫做全局座標變換矩陣。在渲染時,即時的應用這些矩陣來參與運算,寫法:
D3DXMATRIX worldMatrix; //這個矩陣就從檔案中讀進來
Device->SetTransform(D3DTS_WORLD, &worldMatrix);
注意,使用宏 D3DTS_WORLD
從全局座標繫到觀察座標系變換:
這個變換動作,實際上是為了簡化運算而做的。這樣變換之後,所有的頂點也就可以直接轉換為向量,非常的便於某些計算。這個動作通常是,將攝像機平移到全局座標系原點,再旋轉攝像師,使它的光軸與全局座標系z軸方向一致。與此同時,空間中的所有幾何體都要隨攝像機一同變換,以確保攝像機的視場不變。這個變換叫取景變換,變換後得到觀察座標系。
寫法如下:
D3DXMATRIX ViewMatrix;
D3DXVECTOR3 position, targetPoint, worldUp;
D3DXMatrixLookAtLH(&ViewMatrix, //[OUT], 計算出的變換矩陣
&position, //攝像機位置
&targetPoint, //攝像機的觀察朝向
&worldUp);//攝像機的y朝向,也就是頭的朝向
Device->SetTransform(D3DTS_VIEW, &ViewMatrix);
注意宏,D3DTS_VIEW
其實,D3DXMatrixLookAtLH()函數只是類似功能函數中的一個,注意尾碼 LH 這表示左手座標系,對應的還有一個右手座標系,它們的區別在於:左手系 其z軸向裡為正;右手系向外為正。