⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cterrain.h

📁 骨骼动画 此程序演示了如何在你的游戏中使用骨骼动画技术。
💻 H
字号:
/////////////////////////////////////////////////////////////////
//实现了读取高度图RAW,BMP,PNP,JPG等图片高度  ,并能创建一个规则地形,指定宽度,长度和顶点数
//并能产生随机高度地图
/////////////////////////////////////////////////////////////////

#ifndef _CTerrain_H_
#define _CTerrain_H_
#include "FileHeads.h"
#include <vector>
class CTerrain
{
public:

	/** 地形顶点
	*/
	struct TerrainVertex
	{
		float x, y, z;
		float tu, tv;
		float tu2, tv2;

		enum FVF
		{
			FVF_Flags = D3DFVF_XYZ | D3DFVF_TEX2
		};
	};

	/// 地形的材质
	D3DMATERIAL9 m_TerrainMaterial;

	LPDIRECT3DDEVICE9 m_pDevice;
	/// 地形的VertexBuffer
	LPDIRECT3DVERTEXBUFFER9 m_pTerrainVB;
	/// 地形的IndexBuffer
	LPDIRECT3DINDEXBUFFER9 m_pTerrainIB;
	/// 高度图纹理
	LPDIRECT3DTEXTURE9 m_pHeightMap;
	/// 地形表面纹理
	LPDIRECT3DTEXTURE9 m_pTerrainTextures;
	/// 细节纹理, 用来表现地表细节,如沙石等小颗粒。
	LPDIRECT3DTEXTURE9 m_pDetailTexture;
	/// 将高度图纹理的数据保存在内存里,以便查找。
	BYTE *m_HeightBuffer;				

	D3DSURFACE_DESC m_HeightMapDesc;
	std::vector<int> _heightmap;

					

	CTerrain();
	~CTerrain();

	//初始化地形
	//NX和NZ不可以大于像素个数的1/2  否则报错     点的密度越小,越平滑
	bool Init(LPDIRECT3DDEVICE9 pDevice,float LX,float LZ,int NX,int NZ,float fMaxHeight,LPSTR pHeightMapName, UINT uiHeightmapLevel, 
		LPSTR pTexName, LPSTR pDetailTexture, UINT uiDetailLevel);
	//根据像素分配顶点数目,只需要指定地图的长度即可
	bool Init(LPDIRECT3DDEVICE9 pDevice,float LX,float fMaxHeight,LPSTR pHeightMapName, UINT uiHeightmapLevel, 
		LPSTR pTexName = NULL, LPSTR pDetailTexture = NULL , UINT uiDetailLevel =2);
	//定义一个长度任意,宽度任意,XY方向上点任意,高度随机的地图
	bool Init(LPDIRECT3DDEVICE9 pD3DDevice,float LX, float LZ, int NX, int NZ, float fMaxHeight,
		      LPSTR pTexName = NULL, LPSTR pDetailTexture = NULL , UINT uiDetailLevel =2);
	bool InitHeightMap(LPDIRECT3DDEVICE9 pDevice,float LX,float LZ,int NX,int NZ,float fMaxHeight,string pHeightMapName,
		                LPSTR pTexName = NULL, LPSTR pDetailTexture = NULL , UINT uiDetailLevel =2);
	//渲染地形
		//这里要注意众多渲染状态的设置,尤其是Texture Alpha Blending和光照。
	void Render(D3DXMATRIX matWorld1);

	//操作地形的方法接口
	void     setHeightEntry(int x, int y, float value);
	float    getHeight(float x, float z);
	float    getHeightEntry(int x, int y);
private:

	int   m_nNumVertsAlongX ;		// x轴有多少个顶点
    int   m_nNumVertsAlongZ;		// z轴有多少个顶点
    float m_fMeshLengthAlongX;	// x方向上面的长度
    float m_fMeshLengthAlongZ;	// z方向上面的长度
	int m_nMeshCount; //网格数目(m_nNumVertsAlongX-1)*(m_nNumVertsAlongZ-1)
	int m_nMeshVertCount;//整个网格的定点(m_nNumVertsAlongX*m_nNumVertsAlongZ)					
	float m_fMaxHeight;	/// 地形最大高度						
	float m_fTileLengthX;/// 每个地形块的长度(x方向上两个顶点间的距离)	
	float m_fTileLengthZ;/// 每个地形块的长度(z方向上两个顶点间的距离)
	float m_fTileLength;//当不指定宽度和顶点数目时,生成的方格边长
	float m_fWidth;//地图长度
	float m_fTempBase;//单位高度
	D3DXMATRIX m_matWorld;
	UINT m_uiNumXTile;/// x方向上地形块数目							
    UINT m_uiNumZTile;/// y方向上地形块数目							
	UINT m_uiNumTiles;	/// 地形块总数						
	UINT m_uiNumVertices;	/// 顶点数目						
    UINT m_uiNumIndices;	/// 索引数目
	UINT m_uiHeightmapLevel;//
	UINT m_uiDetailLevel;//

	bool     readMap(string fileName);
	bool     loadTexture(string fileName);
	//创建顶点缓冲区
	bool     computeVertices();
	//创建在一定范围内随机高度的地图
	bool     computeVertices(float MaxHeight);
	//创建索引缓冲区
	bool     computeIndices();

	//产生一个基于光照的阴影纹理
	bool     genTexture(D3DXVECTOR3* directionToLight);
	bool     lightTerrain(D3DXVECTOR3* directionToLight);
	float    computeShade(int cellRow, int cellCol, D3DXVECTOR3* directionToLight);

};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -