2017-03-02 62 views
1

我一直在嘗試使用ASSIMP導入模型來實現我自己的3D的openGL/C++遊戲引擎骨骼動畫骨骼動畫。與ASSIMP

我認爲這個問題是由骨基質的計算引起的,因爲如果我把它們分配給身份,網格在其綁定加載姿勢加載着色器中統一變量。

這些都是我用來初始化和計算準備骨基質的功能:

void Joint::AddToSceneGraph(GameObject* root) 
    { 
     GameObject* parent = root->FindChild(m_name); 
     //m_globalInverseMatrix = inverse(root->GetTransform().GetMatrix()); 
     parent->AddComponent(this); 
     while (parent->GetParent() != root) 
      parent = parent->GetParent(); 

     parent->GetTransform().SetParent(NULL); (1) 
    } 

    mat4 Joint::GetMatrix() 
    { 
     mat4 ans = /*m_globalInverseMatrix*/GetTransform().GetMatrix()*m_offsetMatrix; 
     return ans; 
    } 

因爲我試圖呈現其綁定的模特造型,我不會爲您提供計算動畫矩陣的代碼。

一些說明 - 我有一個Transform類,它具有Transform * parent,其GetMatrix()方法從父級的方法計算矩陣,縮放和平移vec3s和旋轉四元數,以便考慮父級和子級之間的關係。我假設父節點的根聯合變換必須是NULL,因此它的矩陣身份,這是(1)的目的。雖然我不確定這個假設,但我確定具有骨架根節點和包含網格的節點是兄弟節點。

而且我不知道天氣我應該使用m_globalInverseMatrix,此外,究竟是它的目的。

總的來說,我認爲我的主要問題是誤解ASSIMP如何計算offset matrix或所謂的inverse bind pose matrix以及如何反轉其效果。這個問題導致了「包裝」本身的模型看:

this is maybe the most famous md5 model

回答

2

從Assimp,從網格空間到骨頭空間骨骼變換的偏移矩陣的文檔。

我設法呈現與您的層次結構類似的綁定pos(如果我沒有誤解,您有一個有兩個孩子的根節點,一個產生骨架層次結構,另一個產生網格)。你需要做的是將m_globalInverseMatrix設置爲包含網格的節點的逆變換。然後,每個骨骼的變換是:

boneTransform = m_globalInverseMatrix * boneHierarchyTransforms * boneOffsetMatrix

其中boneHierarchyTransform來自遍歷樹高達每塊骨骼節點和boneOffsetMatrix是你提到的一個,我在第一段提到。