OpenGL MDL模型显示

来源:互联网 发布:dw网络语是什么意思 编辑:程序博客网 时间:2024/05/06 17:18

我在大二才接触到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)

 

原创粉丝点击