我在大二才接触到CS。当时的我不知道计算机图形学,更不知道OPENGL。玩CS,我太差,我更注意CS的开发,VALVE公司。毕业,工作,......直到今天,我才知道CS的模型,即骨骼动画模型MDL。而且OPENGL的课件,已经封装得很好。
CS的模型基本都是mdl。所在路径为cstrike/models文件夹。例如匪的人物模型terror.mdl,AK47的模型p_ak47.mdl。
MDL模型的接口类class TMDLModel
class TMDLModel
{
...
//提供的接口函数
//初始化模型 入参 文件路径
void Init(char *Filename); //
//绘制模型
void DrawModel(); //
//刷新帧 入参 时间间隔
void AdvanceFrame(float Time); //
//设置动作序列
long SetSequence(long Sequence);//
...
}
类TMDLModel只是单个MDL模型。实际应用中,作者建了一个新类mdlobj,处理多个模型。
//全局变量 数组,存放两个模型
TMDLModel MdlModel[2];
class mdlobj
{
public:
//统计动画播放帧数
unsigned int Animation;
//初始化模型 入参 数组下标 模型文件路径
int InitGL(int a,char* na);
//绘制指定模型 入参 坐标 模型数组下标 缩放倍数 水平角 仰角
void DrawModels(float x,float y,float z,int a,float size,float rz,float ry);
//设置动作
void fire(int a);
};
/////////////////////////////////////// 源文件///////////////////////////////////////
#include "stdafx.h"
#include "mdlobj.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
TMDLModel MdlModel[2];
//////////////////////////////////////////////////////////////////////////
//初始化
int mdlobj::InitGL(int a,char* na)
{
MdlModel[a].Init(na);
MdlModel[a].SetSequence(0);
return TRUE; // Initialization Went OK
}
//绘制模型
void mdlobj::DrawModels(float x,float y,float z,int a,float size,float rz,float ry)
{
glPushMatrix();
glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
//移动到指定坐标
glTranslatef(x, y, z);
glScalef( size, size,size); //缩放
//旋转
glRotated(-90,1.0f,0.0f,0.0f);
//水平角 仰角
glRotated(rz+5,0.0f,0.0f,1.0f);
glRotated(-ry*2/3-5,0.0f,1.0f,0.0f);
static float Previous;
float Current = GetTickCount( )/1000.0f;
//刷新当前动作序列的帧
MdlModel[a].AdvanceFrame(Current - Previous);
//绘制
MdlModel[a].DrawModel();///////////////
Previous = Current;
if(Animation==1)
{
Animation=0;
MdlModel[a].SetSequence(0);
}
if(Animation>0) Animation--;
glPopMatrix();
}
void mdlobj::fire(int a)
{
MdlModel[0].SetSequence(a);
tagMDLSeqDescription *aa=(tagMDLSeqDescription *)((BYTE *)MdlModel[0].Header
+ MdlModel[0].Header->SequenceOffset)+a;
//开火动作序列 Animation : 5 , NumFrames:29
Animation=aa->NumFrames/5;
}
感谢《学OPENGL编3D游戏》课件(来自www.gameres.com)