返回
动画的骨骼实现骨骼的摆放动作
前端
2024-01-07 16:05:36
骨骼动画是一种常用的动画技术,它通过骨架来控制模型的动作。骨架是一组相互连接的骨骼,它们可以旋转和缩放,从而带动模型的各个部分。骨骼动画的主要优点在于它可以产生非常逼真的动作,并且可以很容易地控制模型的运动。
1. 制作骨架
制作骨架的第一步是确定模型的骨骼结构。骨骼结构应该尽可能地模仿人体或其他生物的骨骼结构,以便能够产生逼真的动作。在确定了骨骼结构之后,就可以使用建模软件来创建骨架模型。骨架模型应该包括所有的骨骼,并且每个骨骼都应该有一个唯一的名称。
2. 绑定模型
绑定模型是指将模型的顶点与骨架的骨骼连接起来。这样,当骨骼移动时,模型的顶点也会随之移动。绑定模型可以使用建模软件来完成。在绑定模型时,需要确保每个顶点都与正确的骨骼相连。
3. 动画骨架
动画骨架是指控制骨骼运动的动画数据。动画骨架可以手动创建,也可以使用动画软件来创建。在手动创建动画骨架时,需要逐帧地移动骨骼,并记录下每个骨骼的位置和旋转角度。在使用动画软件创建动画骨架时,可以使用关键帧来控制骨骼的运动。关键帧是动画中指定骨骼位置和旋转角度的帧。
4. 模型变换
模型变换是指根据骨骼的运动来更新模型的顶点位置。模型变换可以使用顶点着色器来完成。在顶点着色器中,需要使用骨骼的位置和旋转角度来计算每个顶点的世界坐标。世界坐标是顶点在世界空间中的位置。
5. 渲染模型
渲染模型是指将模型的顶点数据发送给图形处理单元(GPU)进行渲染。GPU会根据顶点数据生成模型的图像。渲染模型可以使用片段着色器来完成。在片段着色器中,需要指定模型的材质和纹理,并计算每个片段的颜色。片段颜色是片段在屏幕上的颜色。
修复learnopengl骨骼动画的bug代码
//定义Bone结构体
struct Bone
{
glm::mat4 transform; //齐次变换矩阵
Bone *parent; //父骨骼指针
std::vector<Bone *> children; //子骨骼指针数组
};
// 更新骨骼变换
void updateBoneTransform(Bone *bone, const glm::mat4 &parentTransform)
{
bone->transform = parentTransform * bone->transform; //骨骼变换矩阵
for (auto &child : bone->children)
{
updateBoneTransform(child, bone->transform); //递归更新子骨骼变换矩阵
}
}
```
```c++
// 绘制模型
void drawModel(const Shader &shader, const Model &model, const glm::mat4 &view, const glm::mat4 &projection)
{
// 设置骨骼变换
shader.use();
for (unsigned int i = 0; i < model.bones.size(); i++)
{
std::string boneName = "bones[" + std::to_string(i) + "]";
shader.setMat4(boneName, model.bones[i]->transform);
}
// 绘制模型网格
for (unsigned int i = 0; i < model.meshes.size(); i++)
{
const auto &mesh = model.meshes[i];
glBindVertexArray(mesh.VAO);
glDrawElements(GL_TRIANGLES, mesh.indices.size(), GL_UNSIGNED_INT, 0);
}
}
```