首页 > 解决方案 > Assimp,OpenGL:围绕其原点旋转骨骼

问题描述

我在搅拌机中创建了 collada (dae) 模型。我使用 assimp 加载 dae 文件并使用 c++ 中的 opengl 显示它。模型正确显示(下图)。 在此处输入图像描述

骨架具有以下结构:
root,id:0
Armature,id:2
Armature_SPINE_NAVAL,id:3
Armature_SPINE_CHEST,id:4
Armature_NECK,id:5
Armature_HEAD,id:6
Armature_NOSE,id:7
Armature_CLAVICLE_RIGHT,id:8
Armature_SHOULDER_RIGHT,id: 9
Armature_ELBOW_RIGHT, id: 10
Armature_WRIST_RIGHT, id: 11
Armature_HAND_RIGHT, id: 12
Armature_HANDTIP_RIGHT, id: 13
Armature_THUMB_RIGHT, id: 14
Armature_CLAVICLE_LEFT, id: 15
Armature_SHOULDER_LEFT, id: 16
Armature_ELBOW_LEFT, id: 17
Armature_WRIST_LEFT, id: 18
Armature_HAND_LEFT, id: 19
Armature_HANDTIP_LEFT,ID:20
Armature_THUMB_LEFT,id:21
Armature_HIP_RIGHT,id:22
Armature_KNEE_RIGHT,id:23
Armature_ANKLE_RIGHT,id:24
Armature_FOOT_RIGHT,id:25
Armature_HIP_LEFT,id:26
Armature_KNEE_LEFT,id:27
Armature_ANKLE_LE_FTLE,id

在此处输入图像描述

我想对单个骨骼应用旋转。然而,在将围绕 z 轴的 90 度旋转应用到 Armature_WRIST_RIGHT 之后,骨骼臂会被拉伸。下面是我的代码。我做错了什么?

void CalculateBoneTransform(Bone* bone, glm::mat4 parentTransform)
{
    std::string boneName = bone->GetBoneName();
    glm::mat4 boneTransform = bone->GetLocalTransform();    // aiNode->mTransformation
    
    if(boneName == "Armature_WRIST_RIGHT"){
        float RotationAngle = 1.5708;
        float x = 0 * sin(RotationAngle / 2);   // x * sin()
        float y = 0 * sin(RotationAngle / 2);   // y * sin()
        float z = 1 * sin(RotationAngle / 2);   // z * sin()
        float w = cos(RotationAngle / 2);
        glm::quat rot(w,x,y,z);
        boneTransform *= glm::toMat4(rot);
    }
    glm::mat4 globalTransformation = parentTransform * boneTransform;

    if (m_BoneInfoMap.find(boneName) != m_BoneInfoMap.end())
    {
        int index = m_BoneInfoMap[boneName].id;
        glm::mat4 offset = m_BoneInfoMap[boneName].offset; // mesh->mBones[boneIndex]->mOffsetMatrix
        m_FinalBoneMatrices[index] = globalTransformation * offset * glm::scale(glm::vec3(0.2f,0.2f,0.2f));
    }

    for (Bone* j : bone->getChildren())
        CalculateBoneTransform(j, globalTransformation);
}

在此处输入图像描述

以上是我的代码。我做错了什么?我应该如何应用旋转变换来正确旋转选定的骨骼?

标签: c++matrixopenglrotationassimp

解决方案


推荐阅读