2012-08-30 62 views
0

我畫在XNA元的矩形。寬度:擬合一個矩形屏幕XNA

width = GraphicsDevice.Viewport.Width 

,高度爲

height = GraphicsDevice.Viewport.Height 

我想在屏幕上,以適應這個矩形(使用不同的屏幕和設備),但我不知道在哪裏上把相機Z軸。有時相機太靠近,有時甚至遠。

這是我使用讓相機的距離是什麼:

//Height of piramid 
float alpha = 0; 
float beta = 0; 
float gamma = 0; 

alpha = (float)Math.Sqrt((width/2 * width/2) + (height/2 * height/2)); 
beta = height/((float)Math.Cos(MathHelper.ToRadians(67.5f)) * 2); 
gamma = (float)Math.Sqrt(beta*beta - alpha*alpha); 

position = new Vector3(0, 0, gamma); 

任何想法,把相機在Z軸?

+0

什麼場景是太接近了,什麼場面太遙遠?你的代碼看起來應該會產生一致的結果。你還使用什麼投影 - 透視或平行/拼寫? – ChrisF

+0

我用透視與fov:PiOver4。只想原始矩形我畫的時候我加載遊戲(因爲它的大小等於屏幕)以適應屏幕 – alecnash

+0

你能後的「擦邊球」和「過猶不及」的情況下的屏幕截圖? – ChrisF

回答

1

幹什麼的訣竅這是直接在光柵空間繪製矩形。當實際渲染東西時,這是GPU工作的空間。

通常你的模型在自己的模型空間開始,你申請一個世界變換,讓它進入世界空間。然後應用視圖變換來移動相機周圍的點(以獲得相機在世界各地移動的效果)。然後應用投影矩陣將所有這些點都放入GPU用於繪製的空間中。

碰巧這個空間始終是 - 無論屏幕大小 - 從(-1,-1)在視口的左下角,以(1,1)在頂部右邊(從Z軸0到1的深度)。

所以訣竅是將所有矩陣(世界,視圖,項目)設置爲Matrix.Identity,然後畫一個矩形從(-1,-1,0)到(1,1,0)。您可能還需要設置DepthStencilState.None,以便它不影響深度緩衝區。


一種替代方法是隻使用SpriteBatch並繪製於矩形,其大小爲Viewport相同。

+0

我要嘗試一下。儘管如此,爲什麼SpriteBatch應該具有與原始不同的行爲? – alecnash

+1

它沒有。 'SpriteBatch'有一個隱含的正交投影矩陣,覆蓋屏幕(正確像素對齊和所有內容)。它將客戶端空間轉換爲柵格空間。經過轉換後,'SpriteBatch'創建的四邊形應該放在座標上,就像直接放置它們一樣。我提到它的原因是它可以簡單地扔在一起(特別是如果你已經在做2D工作)。 –

+0

金字塔是一個錯誤的方法。我只是用了譚,它的工作。還測試了你的解決方案,它的工作。 – alecnash