前段時間連續(xù)上了一個月班,加班加點完成了一個3D攻堅項目。也算是由傳統(tǒng)web轉(zhuǎn)型到webgl圖形學開發(fā)中,坑不少,做了一下總結分享。
1、法向量問題
法線是垂直于我們想要照亮的物體表面的向量。法線代表表面的方向因此他們?yōu)楣庠春臀矬w的交互建模中具有決定性作用。每一個頂點都有一個關聯(lián)的法向量。
如果一個頂點被多個三角形共享,共享頂點的法向量等于共享頂點在不同的三角形中的法向量的和。N=N1+N2;
所以如果不做任何處理,直接將3維物體的點傳遞給BufferGeometry,那么由于法向量被合成,經(jīng)過片元著色器插值后,就會得到這個黑不溜秋的效果
我的處理方式使頂點的法向量保持唯一,那么就需要在共享頂點處,拷貝一份頂點,并重新計算索引,是的每個被多個面共享的頂點都有多份,每一份有一個單獨的法向量,這樣就可以使得每個面都有一個相同的顏色
2、光源與面塊顏色
開發(fā)過程中設計給了一套配色,然而一旦有光源,面塊的最終顏色就會與光源混合,顏色自然與最終設計的顏色大相徑庭。下面是Lambert光照模型的混合算法。
而且產(chǎn)品的要求是頂面保持設計的顏色,側(cè)面需要加入光源變化效果,當對地圖做操作時,側(cè)面顏色需要根據(jù)視角發(fā)生變化。那么我的處理方式是將頂面與側(cè)面分別繪制(創(chuàng)建兩個Mesh),頂面使用MeshLambertMaterial的emssive屬性設置自發(fā)光顏色與設計顏色保持一致,也就不會有光照效果,側(cè)面綜合使用Emssive與color來應用光源效果。
View Code
3、POI標注
Three中創(chuàng)建始終朝向相機的POI可以使用Sprite類,同時可以將文字和圖片繪制在canvas上,將canvas作為紋理貼圖放到Sprite上。但這里的一個問題是canvas