用OpenGL寫個3D小遊戲

用OpenGL寫個3D小遊戲

自學Opengl四月有餘,其中絕大部分時間都花在看wiki看tutorial上,基本沒敲啥代碼,嘿嘿自以為思路比蠻幹重要,代碼不過只是表達你的思路一種方式而已。不過老話又說實踐是檢驗真理的唯一標準,既然已經把learnOpenGL給看完了,索性檢驗看看自己懂沒懂咯。

最初的想法是用assimp載入幾個model,做一個類似於像拳皇一樣遊戲,當然了是粗糙版咯^_^。翻了好幾個網站沒有找到匹配我的需求的model,轉念想想model由meshes組成,mesh由primitives組成,那麼如果能證明我會操作基本圖元不就歸納證明我會使用model嗎?^_^。然後就想起以前玩過的玩推箱子,不過那是2D版的。既然如此我們給他搞個3D版的如何?於是花了一禮拜魯了有近千行demo終於出來啦。但由於時間關係,texture和antialiasing都還沒做。先看下效果吧,待會再解釋怎麼做吧(ps:是gif動圖,手機可能不支持)。

咳咳,視頻錄的有點失真,意思意思就好。先解釋下什麼是3D推箱子。紅色長方體即為2D的箱子,屏幕中的綠色方塊(尷尬,視頻沒弄好)即為起點,藍色方塊即為終點。規則很簡單,當你從起點挪到終點並把箱子豎在終點時你便贏了。不過在你通往勝利之路上可有陷阱哦,比如說由花花綠綠方塊所構成的大平面之外是外界,當你箱子挪到平面之外時候就算輸了,可以參考左上方的命令台輸出,此時droppable=1。類似的情況是中間被我鏤空的部分,以後或許會加個重力參數~~~然後就可以發生drop事件了 ~~~。其實可添加的元素還有很多,參考2D推箱子加入各種變態開關^_^。

解釋下如何做的吧。由於底部的方塊數量可能非常多,因此draw時候採用instance的方法,當時有想過用geometry shader實現,不過性能尚可以及將來為了改善虛線顯示效果要用到geometry shader因此就用drawinstance了。由於需要自由編輯地圖功能,因此需要將客戶在viewport中點擊之後產生的坐標轉化為世界坐標,此處我參考了RayCasting技術,不過這教程當中演算法有點問題,讀者實現時候應該會發現。另外較難的部分便是求旋轉對稱軸了,哈哈,正好把線性代數複習一下,現在是參考這本書《Mathematics for 3D Game Programming and Computer Graphics》。難點在於如何知道下一次旋轉對稱軸是哪一條,坐標是多少。經過一陣思考,得出以下為代碼覺得挺巧的。即每次旋轉後保存箱子的八個頂點坐標,下一次旋轉時旋轉軸上的點(八個頂點中兩個頂點也在該軸上)有一特性就是當把旋轉軸平移到與坐標軸重合時,就會有兩個頂點在坐標軸上,以下為實現代碼。

其他的似乎沒啥好講的~~~~。下次附上代碼。

推薦閱讀:

好的遊戲開發培訓課程有什麼亮點
Unity快速上手系列之1:拉方塊
[Unity]面試題整理(一)
從零開始學虛幻4遊戲開發系列21

TAG:OpenGL | 遊戲開發 |