用函數式編程,從0開發3D引擎和編輯器(一)
注意:本系列已棄坑!已經重新開了一個新系列:從0開發3D引擎,請讀者轉到該系列閱讀,謝謝!
介紹
大家好,歡迎你踏上3D編程之旅~
本系列的素材來自我們的產品:Wonder-WebGL 3D引擎和編輯器 的整個開發過程,探討了在從0開始構建3D引擎和編輯器的過程中,每一個重要的功能點、設計方案的思考、討論、總結和延伸。
本系列避免陷入細節的實現代碼,使用偽代碼代替。所以沒有可直接運行的代碼,取而代之的是經過抽象和提煉的偽代碼/模式。
為什么要寫這個系列
我有三個小目標:
1.完全創造
完全從0開始,創造一個有深度、有難度、有挑戰的產品。
所以Wonder被創造出來了,并且會持續地發展。
2.完全紀錄
完全紀錄創造的過程,把我整個人生都沉淀下來。
所以有了打造3D引擎,第8000小時開始。
3.完全分享
完全分享所有的創造、紀錄,把我走過的路分享給需要的人。
所以有了Wonder開源 。
本系列為了完成第2個和第3個目標,會把開發Wonder的思考沉淀下來,進行提煉和升華,分享給世界,也分享給我自己。
希望對你有所幫助~
技術棧
-
使用Reason語言寫偽代碼
-
使用WebGL作為底層api
本系列特色
1.完全從0開始,素材來自我們的產品Wonder
我們會一邊開發Wonder,一邊在本系列寫文章分享。
因為Wonder在不斷更新中,所以本系列也會不斷更新。
2.完全、徹底地使用函數式編程。
現在3D領域使用函數式編程的資料很少,主流還是使用面向對象。
我以前也是用面向對象,不過自從我開始接觸函數式編程,就擁抱了它。
面向對象很好,函數式編程也很好。使用哪一個,是每個人的自由。
本系列希望能擴展大家的視野和思維,展示函數式編程的魅力。
3.不僅探討3D引擎,而且以編輯器作為主線。
討論編輯器的資料很少,討論3D引擎+編輯器的更少。
本系列完全基于我們的實戰經驗,以編輯器作為主線,3D引擎作為底層實現。
兩者的關系如下圖:

4.重點放在設計和思考上,避免實現細節
本系列希望展示來自于實戰的思考和設計,在較高的層面進行探討,所以會用偽代碼作為實現的說明,避免細節的干擾。
5.類型驅動設計。盡量用Type和偽代碼替代UML來探討設計。
類型即命題,程序即證明
類型既然對應邏輯命題,那能用它來表示設計嗎?
具體就是:
1)能表達領域模型嗎?
2)能表達領域模型的交互關系嗎?
3)能替代單元測試?
使用類型進行約束,然后在編譯時檢查和發現錯誤,從而不再需要單元測試。
4)能驅動設計嗎?
這樣就能快速驗證設計方案:
通過定義類型來描述需求和設計,不需要具體實現;
驗證通過后,再一一實現。
本系列使用Reason語言,大部分滿足1和2,部分滿足3和4。
這是因為Reason語言的類型沒有Idris強大,所以3和4不能完全滿足。。。。。。
或許以后可以使用Idris來重寫。。。。。。
不過總的來說,我對Reason語言還是非常滿意的,詳見我們在知乎上的總結-如何評價 reasonml ?。
- 參考資料
能給你帶來什么收益?
1.了解Wonder的技術內幕
2.學習從0開發3D引擎和編輯器
3.學習函數式編程及其在3D領域的應用
4.學習3D編程的功能實現,如紋理、光照、模型等功能的實現
5.學習設計和架構,如Data Oriented、多線程、管道job等設計
寫作規劃
Wonder目前開發到1.0版本,因此本系列對應Wonder 0.1 - 1.0版本的內容。
(隨著Wonder不斷更新新版本,本系列也會對應更新)
Wonder 1.0產品展示:
本系列目錄
- 序言
- 函數式編程準備
- 初步需求分析
- 初步設計
- 搭建基礎框架
- 操作GameObject
- 操作Component
- Redo/Undo
- 端對端測試
- 輸出
- 多線程渲染
- 運行/停止
- 事件和CameraContronller組件
- IMGUI
- 增加資產Asset
- 導入/導出
- 發布本地包
- 快捷鍵
- Picking
- Transform Gizmo
- PWA
致謝
感謝你能讀到這里,歡迎你提出各種建議或意見,為你服務是我的榮幸~感謝~
參考資料
Wonder-WebGL 3D引擎和編輯器
Curry-Howard 同構
程序與證明
Designing with types
Reason語言
歡迎瀏覽下一篇博文:用函數式編程,從0開發3D引擎和編輯器(二):函數式編程準備

浙公網安備 33010602011771號