如何将武器模型附着到角色手臂/手部?
骨骼动画武器附着定位问题
我的引擎基于骨骼动画方案实现,角色各类动画(包括mixamorg平台的多段动画)均运行正常,但在将独立武器模型附着到角色手臂/手部时,始终无法获取手臂在世界空间或模型空间的正确位置。已确认骨骼间相对关系正确、动画逻辑无问题,尝试过父子骨骼矩阵相乘等多种方法仍未解决。
相关C++代码
void ArmedAnimatedModel::attachHand(const glm::vec3& playerPosition) { std::string boneName = "mixamorig_RightHand"; std::string parentBoneName = "mixamorig_RightForeArm"; Bone* bone = GetBoneByName(boneName); Bone* parentBone = GetBoneByName(parentBoneName); glm::mat4 childfinalBoneMatrix = GetFinalBoneMatrixByID(bone->GetBoneID()); glm::mat4 parentfinalBoneMatrix = GetFinalBoneMatrixByID(parentBone->GetBoneID()); // Combine the parent and child bone transformations maybe? glm::mat4 finalBoneMatrix = childfinalBoneMatrix; glm::mat4 weaponModelMatrix = glm::mat4(1.0f); weaponModelMatrix = glm::scale(weaponModelMatrix, glm::vec3(0.01f)); weaponModelMatrix = glm::translate(weaponModelMatrix, glm::vec3(X,Y,Z)); LogMatrix(weaponModelMatrix, "final Weapon Model matrix"); weaponModel->GetShader()->use(); LogMatrix(finalBoneMatrix, "finalBoneMatrix"); auto transforms = finalBoneMatrix; weaponModel->GetShader()->setMat4("finalBoneMatrix", transforms); GLint uniformLocation = glGetUniformLocation(weaponModel->GetShader()->ID, "finalBoneMatrix"); glUniformMatrix4fv(uniformLocation, 1, GL_FALSE,&transforms[0][0]); GLuint modelLoc = glGetUniformLocation(weaponModel->GetShader()->ID, "model"); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(weaponModelMatrix)); weaponModel->Draw(); }
顶点着色器代码
#version 330 core layout(location = 0) in vec3 aPos; // Vertex position layout(location = 1) in vec3 aNormal; // Vertex normal layout(location = 2) in vec2 aTexCoord; // Texture coordinates out vec2 TexCoord; out vec3 Normal; out vec3 FragPos; uniform mat4 model; uniform mat4 view; uniform mat4 projection; uniform mat4 finalBoneMatrix; void main() { vec4 totalPosition = vec4(0.0f); Normal = mat3(transpose(inverse(model))) * aNormal; // Correct normal transformation TexCoord = aTexCoord; vec4 localPosition = finalBoneMatrix * vec4(aPos,1.0f); totalPosition += localPosition; mat4 viewModel = view * model; gl_Position = projection * viewModel * totalPosition; // Final position in clip space }
注:view和projection矩阵已在其他位置传递,此处未展示。
内容的提问来源于stack exchange,提问作者afsana
相关产品推荐
相关产品推荐

