2013-08-31 121 views
3

我迷失了骨骼動畫。我已經閱讀了一些關於這方面的內容,但他們仍然是我不明白的一件事。這是我的結論。 我看到3種方式的動畫網格帶骨頭:Directx 11骨骼動畫

  • 我有一個包含頂點,頂點緩衝,索引緩衝和紋理着色器的一類網格,並變換矩陣。我可以使用每個骨骼的類,增加重量,並且我可以很容易地爲模型製作動畫。但是這意味着使用太多的內存,因爲一些事情只有一次纔會被使用。

  • 使用頂點着色器。在輸入頂點參數中添加權重和骨骼索引,並使用矩陣數組作爲全局變量,因此在着色器中我只需使用骨骼矩陣。這個解決方案對我來說似乎更有效率,但我記得在directx 11教程(來自Rastertek)時他說HLSL應該很快,因爲它使用了很多時間,我認爲這會太重。無論如何,這是我會嘗試的解決方案,至少要知道這是否有效。

  • 對每個骨骼使用矩陣和逆矩陣。就閱讀而言,這是可以採取的方式。但這是我不瞭解的方式。爲什麼在這裏使用矩陣逆,以及矩陣如何與頂點「連接」。我的意思是如果我移動右手骨骼的矩陣,在代碼中說只有右手頂點將被使用?

所以我的問題是:

  • 是第二種方法是否可行?或者對於具有一些網格和動畫的GPU來說它會太多?
  • 有人可以解釋矩陣鏈接到頂點的方式,爲什麼矩陣逆使用?或者聯繫我一下。

我希望你明白我的意思,因爲我不確定我是否解釋得很好。請原諒我的英語,我做得儘可能好。提前致謝。

回答

5

如果模型中只有剛性部分,第一種方法可以工作。只要有可變形的零件,就會有孔或其他工件。例如。如果你有一隻手臂的模型,並旋轉前臂,肘部會有一個洞,彎鉤處會有重疊的三角形。

對於第二種方法 - 嗯,我真的不知道你打算怎麼做。像素着色器絕對是做錯事的地方。所有需要完成的事情都可以在頂點着色器中完成。

這使我們接近3

我承認,基於骨骼動畫是有點棘手理解。讓我們考慮一下上面的例子:一隻手臂的模型,由上臂和前臂組成。對於這個模型,我們需要兩個骨頭:一個從肩到肘,一個從肘到手。

每個頂點都應該鏈接到至少一個骨骼。這是通過頂點權重完成的。我們假設有一些肩膀頂點只受到肩膀的影響。肘關節頂點受到兩個骨頭的影響,手頂點僅受到前臂骨的影響。這會產生以下權重:

bone:    | upper arm bone | forearm bone 
--------------------+----------------+-------------- 
shoulder vertices: |  1  |  0 
elbow vertices:  |  0.5  |  0.5 
hand vertices:  |  0  |  1 

首先要做的是計算所有骨骼的位置和方向。這是通過每個骨骼的矩陣完成的。通常動畫師負責計算這些矩陣。該矩陣將從某個參考位置到當前位置放置一個骨骼。所有骨骼的參考位置都是一樣的,可以自由選擇。

接下來要做的是計算結果的頂點位置。我們知道頂點與骨頭一起移動。因此,我們需要骨骼局部座標系中的頂點位置。但是,通常頂點位置以綁定姿勢的世界座標給出。這就是逆矩陣的用途。它將頂點從世界空間(綁定姿勢)轉換到骨骼的局部空間。每個骨骼都有一個逆矩陣。

當我們在骨骼的局部系統中有頂點時,我們必須根據骨骼的運動來轉換它們。對於肩頂點和手頂點來說,這個任務是微不足道的。我們可以使用骨骼的矩陣並將它們乘以逆矩陣。

對於肘部頂點,這並不容易。實際上有很多方法可以計算轉換。我們需要將兩個骨骼的轉換與給定的權重相混合。最簡單的方法是將矩陣乘以它們的權重並將它們相加。這給出了可用於變換頂點位置的最終變換。

的步驟(對於只有一個影響骨):

  1. 變換頂點位置從綁定姿勢到局部骨系統。
  2. 用動畫器計算骨轉換矩陣。
  3. 使用骨骼矩陣將頂點位置從局部骨骼系統轉換爲動畫位置。

如果有多個影響骨骼,矩陣必須混合。骨骼和頂點的鏈接是通過頂點權重實現的。通常,頂點不會爲所有骨骼保存權重。相反,影響骨骼的最大數量限於例如4.然後,頂點存儲前4個影響最大的骨骼及其權重的索引。

+0

對於第二種方式,我的意思是使用頂點着色器,而不是像素着色器,編輯後。但我想我明白了這個問題。當我想渲染一個靜態模型時,我只使用我的着色器類中的渲染函數,但如果我使用動畫模型,我將不得不使用這個函數爲每個骨骼與世界矩陣乘以骨骼變換作爲世界矩陣參數對嗎?順便說一句,謝謝你的解釋。 – Aulaulz

+1

不,您只發出一個繪圖調用,提供所有必要的信息,包括矩陣和頂點權重。 –

+0

然後,我仍然不知道着色器如何知道前臂的像素將與前臂矩陣相關聯。 – Aulaulz