2012-01-08 111 views
-1

我使用正交投影,如果它很重要,我可以使用世界座標在世界上繪製紋理。對於HUD物體,它起初運行良好,但是一旦我有相機並且它移動,我的所有HUD紋理都會隨着世界一起移動,因此遲早會走出相機的視野。將紋理直接繪製到屏幕/客戶端座標上

爲了在HUD上繪圖,必須使用客戶端座標(左上角或中心爲(0,0))繪製它們。任何想法如何做到這一點?我對此很新,所以我希望能有更詳細的幫助。

謝謝!

回答

2

那麼,如果你設置了一個同一性視圖和投影矩陣,那麼所有的座標都會直接通過屏幕。後投影和w除-1,-1是左下角,1,1是右上角,0,0是中心。

現在,如果您希望能夠通過屏幕座標,您需要設置一個世界矩陣,使得0,0,z出現爲-1,1,z和1024,768,z(例如)出現爲1,-1,z,1(z用來給你一個特定的深度,可以用來將HUD元素疊加在一起)。對線性代數的一個很好的理解在這裏有很大的幫助。

從本質上講,如果你寫它,如果你還記得你的矩陣,你得到這樣的事情,你會做以下

xout = (x/(width * 0.5f)) - 1.0f; 
yout = -((y/(height * 0.5f)) - 1.0f); 
zout = z; 
wout = 1.0f; 

左右。

m00, m01, m02, m03, 
m10, m11, m12, m13, 
m20, m21, m22, m23, 
m30, m31, m32, m33, 

基質擴張是使得輸入x座標將總是通過第一列被轉換如下:

xout = m00 * x + m10 * y + m20 * z + m30 * w; 

要記住的第一件事是,座標三重傳入的DirectX(X,Y ,z)擴展到四元組(x,y,z,1)。

這樣我們可以很容易地看到,如果m10和m20都是0,那麼我們有效地將x乘以某個值,然後我們在m30之後添加以前的值。

因此,回到我們對如何計算xout的原始描述中,我們可以看到,如果我們將m00設置爲「1.0f /(width * 0.5f)」,並將m30設置爲-1.0f,那麼我們將計算我們在。因此假設:

xscale = 1.0f/(width * 0.5f); 
yscale = -1.0f/(height * 0.5f); 
zscale = 1.0f; 
xtrans = -1.0f; 
ytrans = 1.0f; 
ztrans = 0.0f; 

然後,我們可以定義出世界矩陣如下:

xscale,  0,  0,  0 
    0, yscale,  0,  0 
    0,  0, zscale,  0 
xtrans, ytrans, ztrans,  1 

組矩陣作爲世界矩陣(記得設置視圖和投影身份),你現在可以輸入你的座標使用屏幕座標。

+0

謝謝!當我將View設置爲標識時,它很好用。 Projection也是身份認證時,工作不正常。只是想知道,現在我的中心爲(0,0),我是否也有可能以某種方式將原點轉移到左上角? – CyberMew 2012-01-12 14:25:18

+0

@Cyber​​Mew:我的帖子的其餘部分解釋瞭如何選擇一個適用於此的世界矩陣。此外,如果您沒有將投影矩陣設置爲標識,那麼您將會遇到問題,因爲投影矩陣最終會導致產生的圖像偏斜。 – Goz 2012-01-12 15:41:44