c++ - 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);
}
以上是我的代码。我做错了什么?我应该如何应用旋转变换来正确旋转选定的骨骼?
解决方案
推荐阅读
- arrays - 空手道 - 如何检查数组是否包含值?
- node.js - ActivatedRoute.params.subscribe 调用了两次
- python - 如何在熊猫分配中动态地给出列名
- python - 从 numpy 数组中的大字符串中获取子字符串
- office365 - 如何在使用 word 插件时使用 office js API 或任何其他方式保存带有文件名的 word 文档?
- html - CSS调整百分比宽度不限制图像大小
- linux - NGINX docker 容器无法在 Web 浏览器中访问
- mysql - 想将mysql查询转换为Sequelize查询:添加行的两个属性并与另一个比较
- firebase - Firebase 手动 UTM 归因
- python - 无法理解该算法的空间复杂度?