GFX::3d::engine-加载播放md5动画

1,由于引擎不能支持md5的material(.mtr),所以它将使用.mtl文件

2,加载.mtl文件和md5动画的mesh文件

OBJ* obj = (OBJ*)calloc(1, sizeof(OBJ));
OBJ_load_mtl(obj, (char*)"bob.mtl", 1);
-- build_texture
-- build_program
-- build_material and set draw materia callback

MD5* md5 = MD5_load_mesh((char*)"bob.md5mesh", 1);
-- optimize
-- build
-- build mesh
-- MD5_set_mesh_material(&md5->md5mesh[i], OBJ_get_material(obj, (&md5->md5mesh[i])->shader, 0));

//加载动作
MD5ACTION *idle = NULL;
MD5ACTION *walk = NULL;
MD5_load_action(md5, (char*)"idle", (char*)"bob_idle.md5anim", 1);
MD5_load_action(md5, (char*)"walk", (char*)"bob_walk.md5anim", 1);

//设置动作
idle = MD5_get_action(md5, (char*)"idle", 0);
MD5_set_action_fps(idle, 24/*fps*/);
MD5_action_play(idle, MD5_METHOD_FRAME), 1/*loop*/);

walk = MD5_get_action(md5, (char*)"walk", 0);
MD5_set_action_fps(walk, 24);
MD5_action_play(idle, MD5_METHOD_SLERP, 1);

-- free_mesh_data

3,绘制

GFX_push_matrix();
//播放idle动画,如果要播放walk动画,则设置为walk->pose即可
if (MD5_draw_action(md5, 1.0f/30.0f))
{
    MD5_set_pose(md5, idle->pose);
}

//一般情况下,需要组合播放骨骼动画,则可以这样做
MD5JOINT* final_pose = calloc(md5->joint, sizeof(MD5JOINT));//这一句要放到初始化的地方

MD5_blend_pose(md5, final_pose, idle->pose, walk->pose, MD5_METHOD_SLERP, .5f);//各占一半的混合
//还有另外一种方式,如果需要组合多个动作的话
MD5_add_pose(md5, final_pose, idle, walk, MD5_METHOD_SLERP, .5f);//walk在混合之后的比重为0.5

MD5_set_pose(md5, final_pose);

MD5_draw(md5);
GFX_pop_matrix();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值