You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将武器模型附着到角色手臂/手部?

骨骼动画武器附着定位问题

我的引擎基于骨骼动画方案实现,角色各类动画(包括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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:54:54