2016-12-25 111 views
0

我試着在Android中的OpenGL ES2中實現骨骼動畫,我有一個從Blender使用io_three導出的JSON模型,我可以從這個文件讀取骨骼數組每個都有位置爲3浮點數組,四元數旋轉作爲4浮動數組和規模和一個整數是父母,我也有動畫有層次結構列表,據我瞭解,每幀處理每個骨骼矩陣,每個層次結構都有父母和鍵列表每個鍵與骨骼相同的組件,所以我讀了很多教程並做了很多嘗試,但不幸的是我沒有成功,我需要簡單地解釋邏輯。 所以我有一個骨類,每個人都有向量,我可以得到每個骨骼的相對矩陣,然後乘以它的父絕對矩陣,以獲得骨骼的絕對矩陣,然後反轉它得到反向矩陣,我可以做每個鍵的計算都一樣,但我無法將它們綁定在一起,我需要了解骨骼和每個框架之間的關係。 我的問題不在於代碼,而在於邏輯。OpenGL骨骼動畫邏輯

回答

2

我將嘗試解釋如何計算動畫的一些t動畫骨架,其中t位於整個動畫的開始和結束時間之間。

我可以從該文件骨骼陣列每一個有位置3個浮點數的數組,四元數旋轉如圖4個浮點數的數組和刻度讀

你也必須具有用於上述即,如果所述定時數據你的動畫中有17幀,每幀的時間信息。假設你有這個或可以從io_three獲得這些數據,你可以計算動畫矩陣。在更精細的步驟是:

  1. 找到位置數據時t即找到2幀,次t1t2這樣:t1 < t < t2。現在您可以計算插值轉換矩陣。
  2. 與1相似,計算插值旋轉和比例矩陣。
  3. 現在找到本地動畫矩陣:A從剛剛計算的T,R,S矩陣中獲得。
  4. 接下來,將本地動畫矩陣與您的骨骼逆向綁定變換相乘。
  5. 現在與父矩陣相乘,以便您有一個累積動畫矩陣。

您可以看到這種computation here的示例:請注意,它位於ObjectiveC中,使用Assimp

您將對骨骼中的每個骨骼執行步驟1到4,並從骨骼的根部一直往下移動,這可確保爲每個骨骼都有一個累積動畫矩陣。您以IdentityMatrix作爲父矩陣開始。

由於您必須從骨架的根開始,您還必須知道根。要麼你的數據提供了骨架的根,要麼你必須得到骨架根。如果您有一個骨骼節點樹,那麼具有最低深度的節點將是root!

一旦您獲得了每個骨骼的動畫矩陣,您還需要知道影響每個頂點的骨骼數量以及該影響的權重。然後,您可以計算CPU或GPU上的變形頂點。請注意,both have their pros and cons

在這個post's top answer中描述了骨骼動畫的更好的解釋,但是使用Assimp庫。總體而言,雖然骨骼動畫的整體邏輯很簡單,困難的部分是導航數據結構,其中包含所有數據並構建正確的動畫矩陣,識別骨架的根節點以及從頂點到骨骼/動畫數據的映射。

+0

清晰明瞭的解釋,謝謝 – Mohamed