DirectX骨骼动画演示,和渐进网格和增进网格的演示

来源:互联网 发布:网络写手新手指南 编辑:程序博客网 时间:2024/05/01 16:54

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:HWNDm_hWnd;//应用程序窗口句柄MSGm_struMsg;//应用程序消息WNDCLASSm_struWndclass;//应用程序窗口类IDirect3DDevice9*m_Device;//D3D设备对象//-----------------//用户数据定义再此//-----------------public://----------------------------------------------------------------------//游戏引擎数据//----------------------------------------------------------------------//渲染库CRenderAssist*m_RenderAssist;//辅助渲染类CRenderMesh*m_RenderMesh;//网格渲染类CRenderAnimMesh*m_RenderAnimMesh;//骨骼动画类public://----------------------------------------------------------------------//游戏项目相关数据//----------------------------------------------------------------------ID3DXFont*m_pFont1;//字体CYMLightm_Light1;//灯光CYMMaterialm_Material1;//材质CYMText2Dm_Text2D1;//2D文本CYMStancem_Stance1;//角色姿态1CYMMeshm_Bigship1;//模型飞机1CYMStancem_Stance2;//角色姿态2CYMMeshm_Windowmodel2;//橱窗模特2CYMStancem_Stance3;//角色姿态3CYMAnimMeshm_Tiny3;//Tiny:骨骼动画CYMStancem_Stance4;//角色姿态4CYMAnimMesh m_Warrior4;//Warrior:骨骼动画/*//网格加载相关的数据ID3DXMesh*m_pBigship1;//茶壶网格对象1D3DMATERIAL9*m_pMtrMesh1;LPDIRECT3DTEXTURE9*m_pTexMesh1;DWORDm_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;}


原创粉丝点击