2010-06-09 22 views
2

這可能是因爲我的數學很生疏,或者我試圖解決這個問題很長時間後就卡在了我的盒子中,無論哪種方式我都需要你的幫助。數學 - 使用三角法在單個視圖中顯示多個對象

背景:我使用XNA在C#中製作基於2d的遊戲。在那場比賽中,我希望攝像機能夠放大/縮小,以便總能看到物體的某一部分。不用說,物體移動的尺寸爲兩個,而相機在三個移動。

情況:我目前正在使用基本三角法來計算攝像機應該在哪個高度以顯示所有對象。我也將相機放置在這些物體之間。

它看起來是這樣的:

1.Loop通過所有對象找到我們的對象的外邊緣:farRight,farLeft,距離Fårup,farDown。

2,當我們知道要顯示什麼有邊緣,計算出中心,也被稱爲相機的位置:

CenterX = farLeft + (farRight - farLeft) * 0.5f; 
CenterY = farUp + (farDown - farUp) * 0.5f; 

3.Loop通過我們的邊緣找到最大的值進行比較到我們的相機位置,從而離屏幕中心最遠的距離。

4.採用最大距離值,我們可以很容易地計算所需的高度,以顯示所有這些對象的(分):

float T = 90f - Constants.CAMERA_FIELDOFVIEW * 0.5f; 
float height = (float)Math.Tan(MathHelper.ToRadians(T)) * (length); 

到目前爲止好,攝像頭位置本身完全基於計算。

問題:

一個)我的渲染目標是1280×720具有45度視場,所以一個總是能看到更多的在X軸,560個像素更實際。這本身並不是一個問題,但更多的是b)...

b)我希望相機比它更遠一點,這樣我們就可以看到更多關於超越最遠點。當然,這發生在X軸上,但這在技術上是我有缺陷的邏輯結果。我希望能夠在X軸和Y軸上看到更多,並控制這種行爲。

問題

嗯,所以要澄清。我想有一些方法來使攝像機位置本身,創建此狀態的一些輸入:

對象將不會比說... 150像素的X軸邊緣和100像素Y軸的邊緣。爲此,攝像機應該沿着Z軸定位,以便視場覆蓋全部。

我不需要編程方面的幫助,只需要計算相機高度的數學和邏輯。正如你可能看到的那樣,我很難將它包裹在我的腦海中,甚至更難以向你解釋。

如果有人在那裏處理這個問題,或者在數學上比我好,我會很感激你說的任何話!:)

回答

2

在步驟3中,您是否需要爲環路中的每個距離測量值添加或減去150或100像素(取決於您正在查看的邊緣),並在步驟4中將該較大的值轉換爲長度?或者我錯過了什麼。

+0

+1簡單,聽起來很對。另一個選擇是爲最終結果添加一個模糊因素,即身高。 – Azim 2010-06-09 22:41:07

+0

添加高度:是我的第一個想法,但我很快意識到我的X軸問題仍然存在。 加分/減分:好吧,現在看來這是我最好的選擇。但是,如果沒有這個,我的物體會停留在屏幕空間的相同位置。現在他們傾向於從屏幕邊緣「吸引」。啊,這個方法表現相當不錯。 – Vectovox 2010-06-10 12:05:48

+0

您需要將高度(考慮Z軸邊緣)和寬度(在考慮X軸時)添加到所有對象的循環中以查找長度。 – 2010-06-10 12:15:43

0

我目前無法進一步探索這方面的內容,但如果任何人有同樣的問題,但不能滿足提供的答案,XNA還有另一種可能性。

ViewPort.Unproject() 

這個漂亮的功能將屏幕空間座標轉換爲世界空間座標。

ViewPort.Project() 

做相反的事情,即將世界空間轉換爲屏幕空間。只是覺得有人可能想要比我進一步。儘管我的強迫症不願讓事情變得不完美,但我還是不能完善這一點。