DirectX骨骼动画演示,和渐进网格和增进网格的演示
未处理的网格
线框模式下的网格
没有简化后的飞机模型
简化后的飞机模型
经过5级增进后的网格(中间的一男一女,)在线框模式下,也能表现出面填充模式的效果
自己封装类三个类:网格类,辅助渲染类,和骨骼动画类,给出主框架类代码
//-----------------------------------------------------------------------------
//类名: CD3DFrame 主框架类(独立类)
//描述: 用于搭建游戏主框架
//文件: D3DFame.h
//作者: CYM
//-----------------------------------------------------------------------------
#pragma once
#include "../JOYO_CYM/Engine.h"
#pragma comment(lib, "lib/JOYO_CYM.lib")
#include "d3d9.h"
#include "d3dx9.h"
class CD3DFrame
{
public:
CD3DFrame(void);
~CD3DFrame(void);
//D3D框架函数
bool Starengine(void);
bool Shutengine(void);
bool Setup(void);
bool Display(void);
bool Inputmsg(void);
bool Cleanup(void);
public:
HWND m_hWnd; //应用程序窗口句柄
MSG m_struMsg; //应用程序消息
WNDCLASS m_struWndclass; //应用程序窗口类
IDirect3DDevice9* m_Device; //D3D设备对象
//-----------------
//用户数据定义再此
//-----------------
public:
//----------------------------------------------------------------------
//游戏引擎数据
//----------------------------------------------------------------------
//渲染库
CRenderAssist* m_RenderAssist; //辅助渲染类
CRenderMesh* m_RenderMesh; //网格渲染类
CRenderAnimMesh* m_RenderAnimMesh; //骨骼动画类
public:
//----------------------------------------------------------------------
//游戏项目相关数据
//----------------------------------------------------------------------
ID3DXFont* m_pFont1; //字体
CYMLight m_Light1; //灯光
CYMMaterial m_Material1; //材质
CYMText2D m_Text2D1; //2D文本
CYMStance m_Stance1; //角色姿态1
CYMMesh m_Bigship1; //模型飞机1
CYMStance m_Stance2; //角色姿态2
CYMMesh m_Windowmodel2; //橱窗模特2
CYMStance m_Stance3; //角色姿态3
CYMAnimMesh m_Tiny3; //Tiny:骨骼动画
CYMStance m_Stance4; //角色姿态4
CYMAnimMesh m_Warrior4; //Warrior:骨骼动画
/*
//网格加载相关的数据
ID3DXMesh* m_pBigship1; //茶壶网格对象1
D3DMATERIAL9* m_pMtrMesh1;
LPDIRECT3DTEXTURE9* m_pTexMesh1;
DWORD m_numMtrMesh1;
*/
};
//-----------------------------------------------------------------------------
//类名: CD3DFrame 主框架类(独立类)
//描述: 用于搭建游戏主框架
//文件: D3DFame.cpp
//作者: CYM
//-----------------------------------------------------------------------------
#include "D3DFrame.h"
//-----------------------------------------------------------------------------
//初始化D3DFrame主框架类的相关数据
//-----------------------------------------------------------------------------
CD3DFrame::CD3DFrame(void)
{
m_Device=NULL;
}
//-----------------------------------------------------------------------------
//释放D3DFrame主框架类的相关资源及数据
//-----------------------------------------------------------------------------
CD3DFrame::~CD3DFrame(void)
{
Release<IDirect3DDevice9*>(m_Device);
}
//-----------------------------------------------------------------------------
// 名字: CD3DFrame类 启动引擎函数
// 描述: 用于创建引擎组成的类和初始化
//-----------------------------------------------------------------------------
bool CD3DFrame::Starengine(void)
{
//创建渲染库类
m_RenderAssist=NULL;
m_RenderAssist = new CRenderAssist();
m_RenderAssist->InitD3D(m_hWnd,true,CYM_Widthx2,CYM_Heightx2,0/*第一块显卡*/,D3DDEVTYPE_HAL,&m_Device);
//创建网格渲染类
m_RenderMesh=NULL;
m_RenderMesh = new CRenderMesh(m_Device);
//创建骨骼动画类
m_RenderAnimMesh=NULL;
m_RenderAnimMesh = new CRenderAnimMesh(m_Device);
//---------------
//创建数学库类
//---------------
return true;
}
//-----------------------------------------------------------------------------
// 名字: CD3DFrame类 关闭引擎函数
// 描述: 用于释放引擎的相关资源
//-----------------------------------------------------------------------------
bool CD3DFrame::Shutengine(void)
{
//关闭渲染库类(s)
Delete<CRenderAssist*>(m_RenderAssist);
Delete<CRenderMesh*>(m_RenderMesh);
Delete<CRenderAnimMesh*>(m_RenderAnimMesh);
return true;
}
//-----------------------------------------------------------------------------
// 名字: CD3DFrame类 加载用户资源函数
// 描述: 加载程序运行所需要的资源
//-----------------------------------------------------------------------------
bool CD3DFrame::Setup(void)
{
//---------------
//创建灯光
//---------------
//灯光的各项值都为默认值
m_RenderAssist->SetEnableLight(0,&m_Light1,true);
//---------------
//创建材质
//---------------
//材质的各项值都为默认值
//m_RenderAssist->SetMaterial(&m_Material1);
//---------------
//创建2D文字
//---------------
//创建字体1ID3DXFont接口
m_pFont1=NULL;
D3DXCreateFont(m_Device,25,12,600,0,false,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,0,"宋体",&m_pFont1);
m_RenderAssist->SetText2DPara(&m_Text2D1,TP_FONT,m_pFont1);
//---------------------
//创建角色姿态Stance
//---------------------
//设置模型飞船姿态
m_RenderAssist->SetStancePara(&m_Stance1,SP_YAWPITCHROLL,D3DXVECTOR3(1.0f,1.0f,1.0f));
m_RenderAssist->SetStancePara(&m_Stance1,SP_VECPOS,D3DXVECTOR3(0.0f,0.0f,-50.0f));
m_RenderAssist->SetStancePara(&m_Stance1,SP_SCALE,D3DXVECTOR3(1.0f,1.0f,1.0f));
//设置橱窗模特姿态
m_RenderAssist->SetStancePara(&m_Stance2,SP_YAWPITCHROLL,D3DXVECTOR3(0.0f,0.0f,0.0f));
m_RenderAssist->SetStancePara(&m_Stance2,SP_VECPOS,D3DXVECTOR3(0.0f,-1.0f,-95.0f));
m_RenderAssist->SetStancePara(&m_Stance2,SP_SCALE,D3DXVECTOR3(1.0f,1.0f,1.0f));
//设置Tiny小人物姿态(骨骼动画)
m_RenderAssist->SetStancePara(&m_Stance3,SP_YAWPITCHROLL,D3DXVECTOR3(4.14f,-3.14f,0.0f));
m_RenderAssist->SetStancePara(&m_Stance3,SP_VECPOS,D3DXVECTOR3(0.0f,-1.0f,95.0f));
m_RenderAssist->SetStancePara(&m_Stance3,SP_SCALE,D3DXVECTOR3(0.1f,0.1f,0.1f));
//设置Warrior战士姿态(骨骼动画)
m_RenderAssist->SetStancePara(&m_Stance4,SP_YAWPITCHROLL,D3DXVECTOR3(0.0f,0.0f,0.0f));
m_RenderAssist->SetStancePara(&m_Stance4,SP_VECPOS,D3DXVECTOR3(-0.20f,-6.0f,-96.0f));
m_RenderAssist->SetStancePara(&m_Stance4,SP_SCALE,D3DXVECTOR3(0.05f,0.05f,0.05f));
//-----------------------
//设置X网格网格对象
//-----------------------
//载入飞船模型(演示渐进网格)
m_RenderMesh->CreateMeshFromX(&m_Bigship1,D3DXMESH_MANAGED,"Model\\Bigship1\\","Model\\Bigship1\\bigship1.x");
m_RenderMesh->OptimizeMeshInplace(&m_Bigship1,D3DXMESHOPT_ATTRSORT|D3DXMESHOPT_COMPACT|D3DXMESHOPT_VERTEXCACHE);
m_RenderMesh->GenerateProgressMesh(&m_Bigship1,D3DXMESHSIMP_FACE,0,0,1);
//载入橱窗模特模型(演示增进网格)
m_RenderMesh->CreateMeshFromX(&m_Windowmodel2,D3DXMESH_MANAGED,"Model\\Windowmodel\\","Model\\Windowmodel\\Windowmodel.x");
m_RenderMesh->OptimizeMeshInplace(&m_Windowmodel2,D3DXMESHOPT_ATTRSORT|D3DXMESHOPT_COMPACT|D3DXMESHOPT_VERTEXCACHE);
//m_RenderMesh->GenerateProgressMesh(&m_Windowmodel2,D3DXMESHSIMP_FACE,0,0,1);
m_RenderMesh->GenerateEnhancedMesh(&m_Windowmodel2,true,1.0f); //增进网格
//-------------------------------
//载入创建骨骼动画
//-------------------------------
//载入Tiny小人物
m_RenderAnimMesh->CreateAnimMeshFromX(&m_Tiny3,D3DXMESH_MANAGED,NULL,"AnimMesh\\Tiny\\","AnimMesh\\Tiny\\tiny_4anim.x");
m_RenderAnimMesh->SetAnimationSetByName(&m_Tiny3,"Jog",0.008f);
//载入Warrior战士
m_RenderAnimMesh->CreateAnimMeshFromX(&m_Warrior4,D3DXMESH_MANAGED,NULL,"AnimMesh\\Warrior\\","AnimMesh\\Warrior\\warrior.x");
m_RenderAnimMesh->SetAnimationSetByName(&m_Warrior4,"stay",0.008f);
//设置默认的渲染方式\摄像机\投影矩阵\纹理过滤方式
m_RenderAssist->RunOnceTimeSetting(1,1,1,1);
return true;
}
//-----------------------------------------------------------------------------
// 名字: CD3DFrame类 释放用户定义的资源函数
// 描述: 用于释放一些全局的内存和资源
//-----------------------------------------------------------------------------
bool CD3DFrame::Cleanup(void)
{
Release<ID3DXFont*>(m_pFont1);
return true;
}
//-----------------------------------------------------------------------------
// 名字: CD3DFrame类 图形显示函数
// 描述: 绘制渲染所要显示的相关动画
//-----------------------------------------------------------------------------
bool CD3DFrame::Display(void)
{
//清空后台缓冲区
m_Device->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DXCOLOR(0.0,0.0,0.0,1.0), 1.0f, 0 );
//开始在后台缓冲区绘制图形
m_Device->BeginScene();
//绘制文字
static float xPos=10.0f,yPos=10.0f;
m_RenderAssist->DrawText2D(&m_Text2D1,"骨骼动画演示及渐进网格和增进网格演示",xPos,yPos);
m_RenderAssist->DrawText2D(&m_Text2D1,"封装了三个类!`网格类,辅助渲染类,骨骼动画类",xPos,yPos+25.0f);
//设置模型飞船姿态
m_RenderAssist->SetStance(&m_Stance1);
//绘制飞船所有网格子集
m_RenderMesh->DrawMeshSubset(&m_Bigship1,DRAWMESHTYPE_PMESH,CYM_All);
//设置橱窗模特姿态
m_RenderAssist->SetStance(&m_Stance2);
//绘制橱窗模特所有网格子集
m_RenderMesh->DrawMeshSubset(&m_Windowmodel2,DRAWMESHTYPE_EMESH,CYM_All);
//设置Tiny小人物姿态(骨骼动画)
m_RenderAssist->SetStance(&m_Stance3);
//绘制骨骼动画
m_RenderAnimMesh->AdvanceTime(&m_Tiny3,0.008f,NULL);
m_RenderAnimMesh->DrawAnimMesh(&m_Tiny3,&m_Stance3.Matrix);
//设置Warrior战士姿态(骨骼动画)
m_RenderAssist->SetStance(&m_Stance4);
//绘制骨骼动画
m_RenderAnimMesh->AdvanceTime(&m_Warrior4,0.008f,NULL);
m_RenderAnimMesh->DrawAnimMesh(&m_Warrior4,&m_Stance4.Matrix);
m_Device->EndScene();
//将在后台缓冲区绘制的图形提交到前台缓冲区显示
m_Device->Present( NULL, NULL, NULL, NULL );
return true;
}
//-----------------------------------------------------------------------------
// 名字: CD3DFrame类 外部硬件设备消息处理函数
// 描述: 用于处理外部设备的消息如:鼠标键盘等
//-----------------------------------------------------------------------------
bool CD3DFrame::Inputmsg(void)
{
//设置渐进网格的简化值
static DWORD face1=0;
static float face2=1.0f;
m_RenderMesh->GetNumFacesP(&m_Bigship1,&face1);
//face2=m_Windowmodel2.pPMesh->GetNumFaces();
if (::GetAsyncKeyState(VK_UP) & 0x8000f)
{ face1+=8; face2+=0.01f;}
if (::GetAsyncKeyState(VK_DOWN) & 0x8000f)
{ face1-=8; face2-=0.01f; }
m_RenderMesh->SetNumFacesP(&m_Bigship1,face1);
//m_RenderMesh->SetNumFaces(&m_Windowmodel2,face2);
//增进网格(完成)
if(::GetAsyncKeyState(VK_UP) & 0x8000f)
{m_RenderMesh->GenerateEnhancedMesh(&m_Windowmodel2,false,face2);}
if (::GetAsyncKeyState(VK_DOWN) & 0x8000f)
{m_RenderMesh->GenerateEnhancedMesh(&m_Windowmodel2,false,face2);}
//切换渲染模式
if (::GetAsyncKeyState('F') & 0x8000f)
{m_Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);}
if (::GetAsyncKeyState('S') & 0x8000f)
{m_Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);}
return true;
}