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

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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值