1. 程式人生 > >攝像機、觀察矩陣與取景變換

攝像機、觀察矩陣與取景變換

重看DX龍書,發現之前想不通的地方居然一下就懂了,可能是我太笨,把一些簡單問題搞複雜了。

本文記錄的是我對取景變換的一些心得。

首先要弄清楚相機代表什麼

其實它就是我們的眼睛,因為最終繪製出來的東西,就是相機視野中的物件。

取景變換,就是要把物體從世界座標系變換到觀察座標系(即相機空間)中來。取景變換可以分為兩個步驟:

1、在世界座標系中使所有物件跟著相機平移,將相機移至座標原點。注意,是使所有物件跟著相機平移。

2、使所有物件跟著相機旋轉,使得相機觀察方向為Z軸正方向,並且相機的UP向量指向Y軸正方向。

由於是所有物件隨著相機一起移動,那物件相對於相機的位置,在移動後和移動前是一致的,那麼為什麼要還要進行取景變換呢?

答案是為了方便固定渲染流水線的下一個步驟,即投影變換。

因為投影變換中要進行線性插值,將相機的視域體(Frustum)變成一個叫做規則觀察體CVV(Canonical View Volume)的長方體,而後者非常便於裁剪。

第2步中,之所以使相機的UP向量指向Y軸正方向,是因為UP向量指向Y軸負方向時,相機的觀察方向也是Z軸正方向,但觀察到的物件是顛倒的。

這就是D3DXMatrixLookAtLH函式中的基準向量引數傳遞(0,1,0)的原因。

講過這兩步仿射變換,物件的座標已經與其在世界座標系中的座標不同了,新的座標系就是觀察座標系。

在觀察座標系中,相機的座標與觀察方向是固定的,而其他物件是可以移動的。但是現實中人是可以移動的,人可以走近一個物體以觀察的更仔細,也可以轉身看到背後的世界。而觀察座標系中的固定相機是無法完成這些的,那怎麼辦?

答案就是實現一個攝像機類。這個攝像機類有4個向量成員:位置向量、UP向量、RIGHT向量以及LOOk向量。這個相機可以沿著UP向量、RIGHT向量和LOOK向量平移,也可以繞著它們旋轉。在這個相機運動之後(其他物體不隨相機運動),可以根據這四個向量計算出一個觀察矩陣,將它設為D3D的觀察矩陣,就等於實現了相機的移動。