簡體   English   中英

不正確的骨骼變換 Assimp

[英]Incorrect Bone Transforms Assimp

我在創建骨架 animation 時遇到問題,我的 model 的轉換不正確

    void Animation(glm::mat4 a[])
    {
        float Factor= fmod(glfwGetTime(),1.0);
        for(int b=0;b<BoneList.size();b++)
        {
    
            Bone *BoneT = &BoneList[b];
            aiMatrix4x4 temp = inverse;
            while(BoneT)
            {
    
                    aiVector3D sc= BoneT->ScaleFrame[0] + (Factor * (BoneT->ScaleFrame[1] - BoneT->ScaleFrame[0]));
                    aiMatrix4x4 S=aiMatrix4x4();
                    S[0][0]=sc.x;
                    S[1][1]=sc.y;
                    S[2][2]=sc.z; 

                    aiVector3D tr= BoneT->LocFrame[0] + (Factor * (BoneT->LocFrame[1] - BoneT->LocFrame[0]));
                    aiMatrix4x4 T=aiMatrix4x4();
                    T[0][3]=tr.x;
                    T[1][3]=tr.y;
                    T[2][3]=tr.z;

                    aiQuaternion R;
                    aiQuaternion::Interpolate(R, BoneT->RotFrame[0], BoneT->RotFrame[1], Factor);
                    R = R.Normalize();

                    temp*=BoneT->NodeTransform*(T* aiMatrix4x4(R.GetMatrix()) * S );
                    BoneT=BoneT->BoneParent;
                
            }
            temp*=BoneList[b].offset;
            temp.Transpose();
            ai_to_glm(temp,a[b]);
        }
    }

我創建了一個 Temp aiMatrix4x4 以保留 assimp 矩陣乘法順序,然后我使用 function 將 aiMatrix4x4 轉換為 glm::mat4:

     void ai_to_glm(const aiMatrix4x4 &from, glm::mat4 &to)
{
    to[0][0] = from[0][0];
    to[0][1] = from[0][1];
    to[0][2] = from[0][2];
    to[0][3] = from[0][3];

    to[1][0] = from[1][0];
    to[1][1] = from[1][1];
    to[1][2] = from[1][2];
    to[1][3] = from[1][3];

    to[2][0] = from[2][0];
    to[2][1] = from[2][1];
    to[2][2] = from[2][2];
    to[2][3] = from[2][3];

    to[3][0] = from[3][0];
    to[3][1] = from[3][1];
    to[3][2] = from[3][2];
    to[3][3] = from[3][3];
}

然而 model 的末端框架如下所示: 攪拌機和程序比較

我注意到如果我從 function 中刪除了翻譯矩陣,model 看起來更接近它應該是什么在此處輸入圖像描述

蒙皮在着色器中完成

layout (location = 0) in vec3 aPos; 
layout (location = 1) in vec2 Tpos;
layout (location = 2) in ivec4 Bones;
layout (location = 3) in vec4 Weight;
uniform mat4 view;
uniform mat4 proj;
uniform mat4 LocRot;
uniform mat4 Test[8];
out vec3 vertexColor;
out vec2 TextCoord;

void main()
{
    mat4 BoneTransform = Test[Bones.x]* Weight.x;
    BoneTransform += Test[Bones.y] * Weight.y;
  BoneTransform += Test[Bones.z] * Weight.z;
   BoneTransform += Test[Bones.w] * Weight.w;
    gl_Position = proj * view *LocRot* BoneTransform *vec4(aPos, 1.0);
    vertexColor = vec3(1,1,1);
    TextCoord = Tpos;
}

並且制服被訪問

    for(int i=0; i<4;i++)
    {
        glUniformMatrix4fv(glGetUniformLocation(ActiveShader->ID, "Test[0]")+i, 1, GL_FALSE, glm::value_ptr(AnimMatrix[i]));
    }

我所知道的:-逆矩陣是單位矩陣,現在對這個 model 沒有任何作用。

- 一些重量總和不等於 1.0 但我認為這不是問題

- 改變矩陣乘法順序並不能解決它

model 在攪拌機中創建並導出

鏈接到 model https://send.firefox.com/download/fe0b85d3f4581630/03rjgLMW0wr

我敢打賭,ai_to_glm function 在這里有問題,但我不確定。

編輯:我注意到旋轉也被翻轉,如圖所示,但是將其乘以 inverseai(倒置根骨變換)沒有任何作用。

更新:我在轉換之前轉置了 assimp 矩陣並修復了大多數問題,但是偏移量和父 inheritance 被竊聽

在任何懷疑之前,我不知道我有堆棧溢出帳戶,我從我的真實帳戶中回答了這個問題

為了解決這個問題,它需要做很多事情:

  1. 迭代骨骼和分配孩子/父母正在使用不穩定的指針並且被破壞,在解決它之后它修復了主要的事情

  2. 我使用了 gpu skinning 的問題矩陣計算中的 codingadventures答案

  3. 我的 ai_to_glm 錯了,用

    glm::mat4 ai_to_glm(aiMatrix4x4* from) { glm::mat4 to = glm::mat4(1.0f); to[0][0] = (GLfloat)from->a1; to[0][1] = (GLfloat)from->b1; to[0][2] = (GLfloat)from->c1; to[0][3] = (GLfloat)from->d1; to[1][0] = (GLfloat)from->a2; to[1][1] = (GLfloat)from->b2; to[1][2] = (GLfloat)from->c2; to[1][3] = (GLfloat)from->d2; to[2][0] = (GLfloat)from->a3; to[2][1] = (GLfloat)from->b3; to[2][2] = (GLfloat)from->c3; to[2][3] = (GLfloat)from->d3; to[3][0] = (GLfloat)from->a4; to[3][1] = (GLfloat)from->b4; to[3][2] = (GLfloat)from->c4; to[3][3] = (GLfloat)from->d4; 還給; };

這樣做之后,它得到了修復

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM