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

本文轉載自:http://eyehere.net/2011/python-pygame-novice-professional-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中的聲音,基本遊戲製作的全部知識我們都快學習完了:)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章