用Python和Pygame寫遊戲-從入門到精通(19)

發表於2015-12-19

3D世界

讓我們現在開始寫一個3D的程式,鞏固一下這幾次學習的東西。因為我們還沒有好好深入如何畫3D物體,暫時就先用最簡單的投影(上次討論過的第二種)方法來畫吧。這個程式畫一個空間裡的立方體,只不過各個部分並不會隨著距離而產生大小上的變化。

您可以看到,很多的小球構成了立方體的各個邊,通過按住方向鍵,可以水平或垂直方向的更改“攝像頭”的位置,Q和A鍵會把攝像頭拉近或拉遠,而W和S會改變視距,綠色的三角是視距和視角的示意圖。fov角大的話,立方體就顯得比較短,反之就顯得比較長。

程式碼稍微有點長,下面有解釋,靜下心來慢慢閱讀。

 

上面的例子使用Vector3來管理向量資料,點的儲存是按照z座標來的,這樣在blit的時候,離攝像機近的後畫,就可以覆蓋遠的,否則看起來就太奇怪了……

在主迴圈的程式碼中,會根據按鍵攝像頭會更改位置——當然這是使用者的感覺,實際上程式碼做的是更改了點的位置。而3D的移動和2D是非常像的,只不過多了一個z來判斷覆蓋遠近(也就是繪製順序),一樣的基於時間移動,一樣的向量運算,只是由Vector2變為了Vector3。

然後程式碼需要繪製全部的點。首先,點的位置需要根據camera_position變數校正,如果結果的z比0還大,說明點在攝像頭之前,需要畫的,否則就是不需要畫。y需要校準一下方向,最後把x、y定位在中間(小球還是有一點點尺寸的)。

留下的程式碼是給出資訊的,都是我們學習過的東西了。

如果想好好學習,把立方體換成其他的影象吧!改一下更能加深印象。

3D第一部分總結

3D是迄今為止遊戲發展中最大的里程碑(下一個會是什麼呢?虛擬體驗?),我們這幾次學習的,是3D的基礎,你可以看到,僅有2D繪圖經驗也能很方便的過渡過來。僅僅是Vector2→Vector3,擔任3D向量還是有一些特有的操作的,需要慢慢學習,但是基本的思想不會變。

但是,請繼續思考~ 難道所有的3D遊戲就是一系列的3D座標再手動轉換為2D畫上去就好了?很可惜或者說很幸運不是的,我們有3D引擎來做這些事情,對Pygame來說,原生的3D處理時不存在的,那麼如何真正繪製3D畫面?有一個非常廣泛的選擇——OpenGL,不瞭解的請自行Wiki,不過OpenGL並不是Pygame的一部分,而且3D實際做下去實在很繁雜,這個系列就暫時不深入講解了。

儘管有3D引擎幫我們做投影等事情,我們這幾次學的東西絕對不是白費,對基礎的一定了解可以更好的寫入3D遊戲,對畫面的掌握也會更好。如果有需要,這個系列的主線完成後,會根據大家的要求追加講解OpenGL的內容。

接下來開始講解Pygame中的聲音,基本遊戲製作的全部知識我們都快學習完了:)

相關文章