有趣又好玩的glm库
一、glm的優(yōu)點(diǎn)
glm是一個(gè)發(fā)展了十年以上的數(shù)學(xué)庫(kù),這個(gè)庫(kù)很不錯(cuò)。很多教材,書(shū)籍,資料大量使用glm,了解glm有助于閱讀這些資料。
1.模仿glsl的接口
這個(gè)實(shí)在是非常方便理解和記憶,你不需要在c++和glsl中使用兩套完全不同的接口
2.大量采用模板
代碼復(fù)用率非常高,而且結(jié)構(gòu)可以說(shuō)是模板類庫(kù)的典范
3.數(shù)學(xué)化的,和大腦導(dǎo)向的思維方式
和其他數(shù)學(xué)庫(kù)不同,glm的代碼偏向數(shù)學(xué)理論的使用,有很多地方是以直觀和復(fù)用為主的
4.接口友好,精度有保證
大量模板參數(shù)的使用,既擴(kuò)充了接口數(shù)量,又保證了支持不同精度,和類型轉(zhuǎn)換的正確。而這些恰恰是非模板數(shù)學(xué)庫(kù)的弱項(xiàng)。
二、glm有趣和獨(dú)特的設(shè)計(jì)
1.detail名字空間
使用detail名字空間,隔離“內(nèi)部函數(shù)”,這對(duì)于用戶程序員來(lái)說(shuō),很容易知道哪些函數(shù)是可以直接調(diào)用的,并且對(duì)于代碼補(bǔ)全也很有幫助。
2.類型設(shè)計(jì),只提供+-x/,其他計(jì)算放到外面
對(duì)于vec,mat等類型,類本身只提供了+-x/等基礎(chǔ)運(yùn)算,而其他運(yùn)算,比如求模,點(diǎn)乘,叉乘,矩陣乘法,特殊矩陣構(gòu)造等等都放到外部通過(guò)全局函數(shù)來(lái)提供,而不是提供一個(gè)類成員函數(shù)。之所以這樣做,是因?yàn)槠渌麖?fù)雜函數(shù),都可以看成是基本運(yùn)算的組合(有些全局函數(shù)的編寫(xiě),還需要增加三角函數(shù)調(diào)用來(lái)支持)。
這樣做的優(yōu)點(diǎn)非常多
????1.保證類型本身足夠簡(jiǎn)單,非常容易閱讀與維護(hù)
????2.比起成員函數(shù),全局函數(shù)可以很容易的修改替換(因?yàn)樵诓煌募?#xff09;。甚至用戶自己擴(kuò)展可以通過(guò)增加頭文件來(lái)完成
????3.高度復(fù)用性,比如求模函數(shù),外部一個(gè)函數(shù)接口,內(nèi)部代碼完全一樣,只靠模板參數(shù)來(lái)匹配。反例就是,如果你使用成員函數(shù),你將不得不對(duì)于每一個(gè)類型提供一個(gè)求模函數(shù)
3.全局函數(shù)+模版類偏特化——實(shí)現(xiàn)函數(shù)調(diào)用的轉(zhuǎn)發(fā)
很多全局函數(shù),只提供一個(gè)入口調(diào)用,內(nèi)部使用模版類偏特化來(lái)匹配模板參數(shù),完成對(duì)應(yīng)類型的函數(shù)調(diào)用轉(zhuǎn)發(fā),這個(gè)寫(xiě)法非常有趣。我們知道全局函數(shù)調(diào)用,使用一個(gè)入口,可以非常方便的修改,例如加入條件編譯宏等,而模版類偏特化又保證了擴(kuò)展性。
4.復(fù)用優(yōu)先
例如,對(duì)于矩陣相乘,glm直接采用向量寫(xiě)法。glm的編寫(xiě),在很多地方,直接采用向量。這一方面,極大簡(jiǎn)化了代碼量,同時(shí)也體現(xiàn)出作者對(duì)于數(shù)學(xué)的深刻理解。
而很多其他數(shù)學(xué)庫(kù)不同,向量運(yùn)算采用不多,比如矩陣相乘直接采用元素寫(xiě)法。
三、難點(diǎn)
1.glm對(duì)于數(shù)學(xué)功能拆的很細(xì)
同一個(gè)類型的很多功能,分散在不同的文件中,這閱讀起來(lái)有一定的難度,尤其是缺乏數(shù)學(xué)基礎(chǔ)的人
2.大量使用模板
對(duì)于模板不熟悉的人,閱讀有難度,現(xiàn)在國(guó)內(nèi)移動(dòng)游戲項(xiàng)目開(kāi)發(fā)很少直接大量用c++了,大量模板的人估計(jì)就更少了
總結(jié)
以上是生活随笔為你收集整理的有趣又好玩的glm库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DirectUI界面编程(六)实现右键弹
- 下一篇: 一位好友的大学反思