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();