2015-11-14 215 views
12

在過去的幾周裏,我一直在嘗試學習libGDX庫。我很難找到它,特別是對於我第一次嘗試開發遊戲,以瞭解相機/視口關係系統。一行代碼,我已經被告知使用,以及API提到,就是:瞭解libGDX投影矩陣

batch.setProjectionMatrix(camera.combined); 

儘管好4個小時的研究,我仍然缺乏這種代碼的功能一個完整的認識。這是我的基本理解,它「告訴」相機正在尋找的批次。我的理解力不足令人沮喪和憤怒,如果有人能幫助我,我會很感激。代碼片段的另一個問題是我不確定何時需要實現(在render方法中,create方法等)。

回答

14

考慮用相機拍照。例如。使用您的智能手機相機在公園裏拍張長椅。當你這樣做的時候,你會在智能手機的屏幕上看到公園裏的長凳。這看起來很明顯,但讓我們看看這涉及到什麼。

圖片上的替補的位置是相對於你在哪裏拍攝照片時站立。換句話說,它是相對於相機。在典型的遊戲中,您不會將對象放置在對象上。相反,你把它們放在你的遊戲世界中。在你的遊戲世界和你的相機之間進行翻譯是通過使用一個矩陣來完成的(這只是一種轉換座標的數學方法)。例如。當您將相機移動到右側時,長凳會移動到照片的左側。這被稱爲視圖矩陣。

上的圖像的替補的確切位置也取決於長凳和照相機之間的距離。至少,它在3D中(2D非常相似,所以請繼續閱讀)。當距離較遠時,距離較近的攝像機較小。這被稱爲透視投影。你也可以有一個正交投影,在這種情況下,物體的大小不會根據相機的距離而改變。無論哪種方式,公園的長椅的位置和大小都會轉換爲屏幕上的像素位置和大小。例如。公園的長凳是兩米寬,而照片上是380像素。這被稱爲投影矩陣。

camera.combined表示組合視圖和投影矩陣。換句話說:它描述了遊戲世界中的事物應該在屏幕上呈現的位置。

batch.setProjectionMatrix(cam.combined);調用指示批次使用該組合矩陣。只要值發生變化,您應該調用它。這通常是在調用resize時以及每當您移動或以其他方式更改相機時。

如果你不能確定,那麼你可以調用你的render方法的開始。

+0

很好的解釋。 –

7

其他答案非常好,但我認爲描述它的另一種方式可能有助於點擊。

通常你處理你在「世界空間」的遊戲,座標系統,類似於現實世界。在線性代數中,可以通過將點的座標乘以代表兩個座標系之間關係的矩陣,將空間中的點從一個座標系轉換爲另一個座標系。

視圖矩陣由點相乘,它從世界空間轉換到攝像機空間(的攝像機視點)。投影矩陣用於將相機空間中的點轉換爲屏幕空間(設備屏幕的平面2D矩形)。當您在Libgdx的相機上撥打update()時,它會將最新的更改應用於位置,方向,視區大小,視野等。到它的視圖和投影矩陣,以便它們可以在着色器中使用。

您很少需要在2D中處理相機空間中的東西,因此SpriteBatch不需要單獨的視圖和投影矩陣。它們可以組合成一個矩陣,將直接從世界空間轉換爲屏幕空間,這已經在相機中自動完成,因此可以使用camera.combined矩陣。

SpriteBatch有一個默認的內置着色器,它將這個投影矩陣乘以精靈的所有頂點,這樣它們將被正確地映射到純平屏幕。

無論何時移動相機或調整屏幕大小,您都應該致電setProjectionMatrix

還有第三種稱爲模型矩陣的矩陣,用於3D物體。模型矩陣描述了模型在世界空間中的方向,比例和位置。所以它乘以模型中的座標將它們從本地空間移動到世界空間。

4

例如一個基本的sidescrolling遊戲。當玩家移動到一邊時,攝像機會跟隨它們。這意味着物體在世界中的位置不一定與它們在屏幕上的位置相對應,因爲屏幕和世界相對於彼此移動。

下面是一個例子:假設你的屏幕是100px * 100px square(出於某種原因)。您將一個對象放置在位置(50,0)處,因此它現在位於屏幕的中間和底部。現在說你把玩家移到右邊,整個屏幕都會跟隨玩家。這意味着您之前放置的對象應已在屏幕上向左移動。所以它在世界上仍然是(50,0),因爲它實際上並沒有相對於其他景物移動,但現在它應該被畫在(10,0)屏幕上,因爲哪一部分屏幕正在看的世界已經發生了變化。這就是「世界空間」(世界上的一個物體)和「屏幕空間」(在實際顯示中繪製物體的位置)之間的區別。

當您嘗試使用SpriteBatch進行繪製時,默認情況下會假設世界座標與屏幕空間座標相同:當您說「draw at(50,0)」時,它將繪製對象在( 50,0)在屏幕上。即使照相機移動,它總是會在屏幕上以(50,0)繪製,因此當照相機轉動時,對象將隨之停留在屏幕上的相同位置。

既然你通常不希望出現這種情況,你給SpriteBatch一個投影矩陣,這是一個轉換矩陣,它告訴你如何屏幕空間座標轉換到世界空間座標,反之亦然。這樣,當你告訴批處理「在(50,0)處繪製」時,它可以查看它從相機獲得的矩陣,並且看到,由於相機已經移動,所以世界中的(50,0)實際上意味着10,0),它會在正確的位置繪製你的精靈。