3ds max 匯出外掛——md5Exporter完結篇
今天還有思路來記錄下,就乾脆完結篇也一起出了,本來是想中篇是動畫相關的,完結篇是其他附加功能完成後的,但時間又少,而且很多小功能也沒多大必要來佔地方。還是記錄重要的東西吧。
用md5有段時間了,再說點需要注意的地方和一些想法還沒去做。
一個是把mesh按照引用的骨骼數量限制來切分。
在類似Away3D這樣的AS3的3D引擎中,shader的暫存器數量限制很大,只有128個4維向量大小。除開材質和變換矩陣,能夠給gpu計算動畫的骨骼矩陣只有30-40個左右。那麼一套骨架的骨骼總數就要在30-40左右。但很多情況下不能滿足美術要求,在這種骨骼總數超出了傳遞給gpu的骨骼矩陣陣列的情況下,又需要用gpu渲染出對應動畫。有個解決方法是把一個mesh按照所用到的骨骼數量做切分,劃分成多個mesh,每個mesh自己用到的骨骼數量可以全部傳給gpu。這樣在渲染mesh的時候就不是把整個骨架的骨骼傳遞給gpu,而是把它所用到的骨骼傳遞給gpu
我在外掛中實現了這個功能,不過還有些不完善的地方,而且劃分方式不是最好的。
原本在糾結是在解析md5的時候做mesh的切分,還是在匯出的時候切分,不過後來想了下,還是匯出的時候做吧,用的地方多些啊。
另外再說下對有動畫的模型的拾取和射線查詢的一點想法。
在用頂點動畫的模型上面做拾取倒是很簡單的啊,不管是3D空間中的還是向pbuffer那樣渲染到紋理後進行的查詢。
用骨骼動畫的模型就有點區別。
軟計算骨骼的就和頂點動畫的沒區別。
用gpu計算動畫的模型,想在3D空間中查詢的話就有問題了,模型頂點不是按照骨骼偏移後的,仍然是初始狀態的。用渲染到紋理的方式查詢就問題不大,只要渲染到紋理的時候計算了動畫的就行。不過Away3D4.1中雖然支援用渲染到紋理的方式拾取查詢,但是他對骨骼動畫模型這種東西是沒有計算骨骼就渲染的,所以拾取的時候是錯的。
如果想在3D空間中射線查詢用gpu計算骨骼動畫的模型,可以按照常用做法,用一系列骨骼的包圍體來描述模型,先檢測骨骼,再檢測頂點。
不過這點有個問題需要注意,不同模型的頂點相對同一根骨骼的偏移是不同的,骨骼的包圍體應該按照它所影響的頂點來計算。那不同模型的包圍體就是不一樣的了,這種包圍體的描述資訊,我按照之前的想法,感覺應該在匯出外掛中完成,以後好用!
按照md5的檔案劃分方式,原本包圍體是放到anim中的,一個動畫檔案包含每一幀的aabb。需要把包圍體調整到mesh中,並且包圍體是按骨骼層級儲存,每個骨骼的包圍體。在需要檢測得時候就像更新動畫一樣的更新骨骼的包圍體,計算量會比更新頂點小很多,box形狀的就只有8個點每根骨頭。其實固定動畫更新所生成的包圍體是重複的,可以只計算一次快取下來,減少計算量。
還有個東西需要儲存,一根骨骼所影響的面片,這是在做精確查詢時需要的。按照之前的方式這也在匯出的時候完成,為了以後方便啊!
這都只是我的一點設想,還有物理引擎支援模型的查詢,都是可以的。