《游戏设计》课程设计指导书

时间:2024.5.8

《游戏设计》 课程设计指导书

编写:蔺广逢 适用于:数字媒体专业

2011.12

游戏设计课程设计任务书

设计时间:1周 学 分 数:1.0

执笔人:范彩霞 编写日期:20xx年10月

一、课程设计目的

游戏设计课程设计是数字媒体技术专业必修的实践环节。本课程设计是《游戏设计》课程实践环节的深化和延续。通过该实践环节的训练,使学生能够更加全面和系统的掌握游戏设计的体系结构。通过对所做游戏的故事梗概、游戏类型以及设计制作过程中所涉及的相关技术的学习和掌握,提高学生的实践能力以及团队协作能力,为在计算机游戏设计这一领域进行深入研究做准备。

二、课程设计的内容与要求

本课程设计通过分组来进行,每组3~4人。对每一个组,都必须设计和实现一个完整的游戏,游戏的类型不限,软件运行环境限为Microsoft Windows,硬件平台限为PC。在每组进行游戏设计之前必须提供游戏文档说明,包括游戏的故事情节、游戏的类型、游戏界面的设计等。每组设计的游戏不一定是原创的,但绝不能抄袭已有的游戏。

每组设计的游戏需要有较为完整的情节,要求能体现以下的基本技术:提供使用键盘或鼠标控制视点的朝向和运动的功能;在游戏中至少有一个人物是三维的,并且能产生相应的动画。必须在某个场景中有配音或者背景音乐;最好能在某一个画面中体现一些特效技术;必须能实时或者准实时运行。

游戏设计完成后对自己所做的游戏进行短评,包括:游戏中的哪一部分是最得意的?对最初的游戏设计作了哪些修改,为什么?在这个游戏项目的实践中获得的经验和教训是什么?如果有更多的时间下一步会怎么做?

三、课程设计的报告(论文、作业)的要求

课程设计报告是课程设计过程的整理和总结。因此,编写课程设计报告是课程设计阶段的一个重要组成部分。课程设计报告的内容和要求根据设计内容而定,对于本课程设计,主要应包括以下内容:

封面:封面上应标明“游戏设计课程设计”报告、专业、姓名、学号与时间等; 课程设计报告内容主要包括:

(1)课程设计的目的;

(2)课程设计的内容:主要包括:游戏的故事摘要 ;游戏的类型;各成员的分工;

制作工具;流程图以及如何玩这个游戏。重点写明设计思想,制作步骤、制作过程中出现的问题、解决方案等;

(3)总结:总结成功之处与问题所在,自己通过本次课程设计有什么收获和感悟。

四、课程设计考核与成绩评定

根据学生的实验准备、操作能力、实验结果、实验报告质量、实验纪律等综合评定实验成绩。

(1)总分100分:其中考勤10分,作品50分,课程设计报告40分;

(2)考勤每天上、下午1次,每次2分;

(3)如发现有严重抄袭者,个人成绩以零分计;

(4)课程设计报告以准确、规范、认真等指标进行打分,不得抄袭,否则总成绩按

零分计。

五、课程设计纪律及注意事项

(1)每位参加课程设计的同学必须认真对待,积极参加;

(2)从严要求自己,不随意迟到、早退和旷课,有事需例行请假手续,实验室内不得

玩计算机游戏;

(3)在课程设计中应积极发挥个人主观能动性,勤于思考,虚心向指导教师、实验室

教师请教,服从实验室教师的安排;

(4)爱护实验室的所有财产,不得私自删除机器上系统文件;

(5)保持实验室的整洁卫生。

凡违反课程设计纪律者,指导教师或实验室教师有权进行批评教育或终止其课程设计,成绩以零分记。

DirectX初级教程

1. 开发环境 ...................................................................................................................................................... 3

2. 3D基本概念 ................................................................................................................................................ 3

2.1 几种颜色的变量类型及其相关函数应注意区分: ......................................................................... 3 ........

2.2 材质 ..................................................................................................................................................... 4

2.3 向量 ..................................................................................................................................................... 4

2.4 光源 ..................................................................................................................................................... 4

2.5 摄像机(camera) ............................................................................................................................. 4

3. 创建D3D设备............................................................................................................................................. 5

3.1 Direct3DCreate9 ( ) .......................................................................................................................... 5

3.2 CreateDevice ( ) ............................................................................................................................... 5

3.3 基本变量 ............................................................................................................................................. 5

3.4 其他要调用的函数及变量(调用次数较少) ................................................................................. 5

4. 基本渲染顶点 .............................................................................................................................................. 6

4.1 定义顶点格式和FVF; ................................................................................................................ 6

4.2 创建顶点缓冲区并填充之; ............................................................................................................. 6

4.3 D3D进行渲染; ............................................................................................................................. 7

5. 使用顶点索引缓冲区 ................................................................................................................................... 8

5.1 创建顶点索引缓冲区并填充之 ......................................................................................................... 8

5.2 将顶点索引缓冲区设置到渲染管道流水线 ..................................................................................... 9

6. 摄像机 ........................................................................................................................................................ 10

6.1 D3D中使用的几种常用的向量 ...................................................................................................... 10

6.2 D3D相机中使用的几种常用的关于向量的函数 ....................................................................... 10

6.3 点和向量的区别 .............................................................................................................................11

6.3 Camera相机矩阵计算问题 ...............................................................................................................11

7.基本纹理应用 ................................................................................................................................................ 12

7.1 纹理尺寸 ............................................................................................................................................. 12

7.2 纹理坐标 ............................................................................................................................................. 12

7.3 基本纹理添加步骤以及所使用的函数 ............................................................................................. 12

8.模型加载 ........................................................................................................................................................ 14

1.装载模型 ................................................................................................................................................. 14

2.填充纹理和材质 ..................................................................................................................................... 14

3.渲染 ......................................................................................................................................................... 14

1. 开发环境

注意,一定要把新加的SDK路径移动到目录列表的最上方,因为VC是按顺序搜索路径的。 最基本的DX定义规范:I开头的是接口;

D3D开头的一般是定义的一些结构;

D3DX是封装了操作的扩展结构;

2. 3D基本概念

2.1 几种颜色的变量类型及其相关函数应注意区分: ........

D3DCOLOR、D3DXCOLOR、D3DCOLORVALUE。

注意:1. D3DCOLOR属于DWORD型的变量,其定义包含在d3d9types.h文件中;

2. D3DXCOLOR属于结构体类型,其定义包含在d3dx9math.h中:

typedef struct D3DXCOLOR

{

FLOAT r;

FLOAT g;

FLOAT b;

FLOAT a;

} D3DXCOLOR; // r, g, b, a的范围在0.0f-255.0f之间

3. D3DCOLORVALUE同属于结构体类型,其定义包含在d3d9types.h文件中:

typedef struct _D3DCOLORVALUE {

float r;

float g;

float b;

float a;

} D3DCOLORVALUE; // r, g, b, a的范围在0.0f-1.0f之间

与各个变量相对应的函数或宏也包含在与变量相对应的头文件中(带有x的变量其对应头文件也包含x,方便记忆)。下边介绍相关函数及宏。

1. 与D3DCOLOR相对应的宏有以下4个:

1. #define D3DCOLOR_ARGB(a , r, g, b) \

((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))

2. #define D3DCOLOR_RGBA(r, g, b, a) D3DCOLOR_ARGB(a,r,g,b)

3. #define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b)

其中该宏的Alpha值定义为255,完全不透明。

4. #define D3DCOLOR_COLORVALUE(r,g,b,a) \

D3DCOLOR_RGBA((DWORD)((r)*255.f),(DWORD)((g)*255.f),(DWORD)((

b)*255.f), \

(DWORD)((a)*255.f))

前三个宏的r,g,b,a值均为整型数,最后一个必须是从0.0到1.0的浮点型数。

2.2 材质

材质的定义是:

材质

typedef struct _D3DMATERIAL9

{

D3DCOLORVALUE Diffuse; // 漫反射光

D3DCOLORVALUE Ambient; // 环境光,理解为整体亮度

D3DCOLORVALUE Specular; // 镜面反射,一般用于光滑的平面

D3DCOLORVALUE Emissive; // 放射光,一般用于自发光体(太阳、灯…) 对于材质设置,自发光不应太强。

float Power; // 指定镜面高光的强度

}

D3DMATERIAL9;

2.3 向量

typedef struct _D3DVECTOR {

float x, y, z;

} D3DVECTOR; 该定义包含在d3d9types.h头文件

中。

2.4 光源

typedef struct _D3DLIGHT9 {

D3DLIGHTTYPE Type; // 光源类型,有点光源、聚焦光源、方向光源3种 D3DCOLORVALUE Diffuse; // 漫反射光颜色

D3DCOLORVALUE Specular; // 镜面反射光颜色

D3DCOLORVALUE Ambient; // 环境光颜色

D3DVECTOR Position; // 光源位置(对方向光源无效,如果创建方向光源可忽略)

D3DVECTOR Direction; // 方向(对点光源无效,如果创建点光源无效可忽略。

可以是非单位向量,但是不能是0向量)

float Range; // 光的范围,就是能照多远(对方向光无效,如果创建方向光源可忽略)

float Falloff; // 聚光内外光圈的径向强度衰减,一般为1.0f (只针对聚焦光源) float Attenuation0; // 距离衰减0(创建方向光源可忽略,非方向光源一般3个距离衰减均取取0.0f)

float Attenuation1; // 距离衰减1(创建方向光源可忽略,非方向光源一般3个距离衰减均取取0.0f)

float Attenuation2; // 距离衰减2(创建方向光源可忽略,非方向光源一般3个距离衰减均取取0.0f)

float Theta; // 指定聚光内圈的夹角大小(0-Phi)(只针对聚焦光源)

float Phi; // 指定聚光外圈的夹角大小(0-pi)(只针对聚焦光源) } D3DLIGHT9;

注:1. 这里非方向光源指 点光源 和 聚焦光源。 .....

2. 添加光照并开启光照,而且必须为模型或面添加了法向量及材质,光源才起作..............

即光照三要素:光照、材质、法向量。 用。

2.5 摄像机(camera)

摄像机的确定有两个主要参数:一个位置和一个方向。

将摄像机设置到场景中要用到SetTransform( D3DTS_VIEW, &m_matView ); // m_matView就是摄象机的观察矩阵。

3. 创建D3D设备

所需的主要的2个函数和3个变量(其余函数根据所需变量的填充要求而定) ........

3.1 Direct3DCreate9 ( )

其原型为

IDirect3D9 * Direct3DCreate9 ( UINT SDKVersion ); SDKVersion为SDK版本值,函数及SDKVersion的定义包含在d3d9.h中,编译过程中需要d3d9.lib链接库。

3.2 CreateDevice ( )

HRESULT CreateDevice ( UINT Adapter,

D3DDEVTYPE DeviceType,

HWND hFocusWindow,

DWORD BehaviorFlags,

D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface

);

参数解释:

UINT Adapter

一般使用D3DADAPTER_DEFAULT代表主适配器(即显示器);

D3DDEVTYPE DeviceType

D3DDEVTYPE_HAL代表使用硬件加速方式,D3DDEVTYPE_REF代表使用软件仿真方式;

HWND hFocusWindow

代表要创建D3D设备的窗口的句柄

DWORD BehaviorFlags

处理标识:最常用的选项有 D3DCREATE_HARDWARE_VERTEXPROCESSING硬件处理

D3DCREATE_SOFTWARE_VERTEXPROCESSING软件处理

D3DCREATE_MIXED_VERTEXPROCESSING软硬件

结合处理

D3DPRESENT_PARAMETERS *pPresentationParameters

描述设备显示参数的结构体,一般要调用其他函数来填充该结构体;

IDirect3DDevice9** ppReturnedDeviceInterface

用于返回D3D的设备对象指针。

3.3 基本变量

D3DCAPS9、D3DDISPLAYMODE、D3DPRESENT_PARAMETERS三个比较基本的变量,用于描述显示设备创建时的相关参数。

3.4 其他要调用的函数及变量(调用次数较少)

HRESULT GetDeviceCaps( UINT Adapter,

D3DDEVTYPE DeviceType,

D3DCAPS9 *pCaps

);

HRESULT GetAdapterDisplayMode( UINT Adapter,

D3DDISPLAYMODE *pMode

);

UINT GetAdapterCount( VOID );

4. 基本渲染顶点

渲染的基本步骤是这样的:

4.1 定义顶点格式和FVF;

顶点格式必须与FVF中定义的一致,这样流水线才能识别。

如:struct CUSTOMVERTEX

{ FLOAT x, y, z; // 顶点坐标

DWORD color; // 顶点颜色

};

与之相对应的FVF为蓝色部分。

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

4.2 创建顶点缓冲区并填充之;

使用的基本函数有:

1. CreateVertexBuffer();

HRESULT CreateVertexBuffer( UINT Length,

DWORD Usage,

DWORD FVF,

D3DPOOL Pool,

IDirect3DVertexBuffer9** ppVertexBuffer,

HANDLE* pHandle

);

UINT Length

用来指定顶点缓冲区的大小;

DWORD Usage

一般设置为0;

DWORD FVF

自定义可变顶点格式;

D3DPOOL Pool

可用D3DPOOL _DEFAULT = 0 (一般用这个比较多), ...............

D3DPOOL_MANAGED = 1,

D3DPOOL_SYSTEMMEM = 2,

D3DPOOL_SCRATCH = 3,

IDirect3DVertexBuffer9** ppVertexBuffer

指向顶点缓冲区COM对象的指针。

HANDLE* pHandle

一般设置为NULL。

2. Lock()

HRESULT Lock( UINT OffsetToLock,

UINT SizeToLock,

VOID **ppbData,

DWORD Flags

);

UINT OffsetToLock,

锁定区域偏移量,一般为0;

UINT SizeToLock,

要锁定区域的大小;

VOID **ppbData,

返回指向缓冲区数据的指针;

DWORD Flags

锁定行为标识符,一般设置为0;

3. memcpy( )(用此函数将计算好的数据拷贝进缓冲区),如memcpy(in,out,sizeof(buffer));

4. HRESULT Unlock(VOID);

解除对数据区的锁定,一边流水线渲染可以正常执行。

4.3 D3D进行渲染;

有两个基本函数:

1. SetStreamSource()用于将顶缓冲区设置到流水线中;

HRESULT SetStreamSource( UINT StreamNumber,

IDirect3DVertexBuffer9 *pStreamData,

UINT OffsetInBytes,

UINT Stride );

UINT StreamNumber 一般设置为0;

IDirect3DVertexBuffer9 *pStreamData 指向顶点缓冲区COM对象的指针;

UINT OffsetInBytes 指针偏移量不偏移则取0;

UINT Stride 顶点跨距,即每个顶点所占的字节数

2. SetFVF()用于将顶点自定义格式传递给流水线。

注:IDirect3DDevice9::SetFVF(Vertex::FVF)

FVF保存着顶点描述,FVF的定义形式如下:

#define FVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)或

DWORD const dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL |

D3DFVF_DIFFUSE );

D3DFVF_XYZ:表示顶点格式中包含顶点坐标信息。它告知系统你的游戏没

有变换过顶点,要求Direct3D来做顶点的变换工作。

D3DFVF_XYZRHW:告知系统你的游戏引擎已对顶点作过变换,Direct3D不需

要再对它们作变换。也就是说,Direct3D就不会再用世界矩阵、观察矩阵或投射矩阵来变换顶点了。

D3DFVF_DIFFUSE:表示顶点格式中包含了一个漫反射颜色信息。 D3DFVF_SPECULAR:表示顶点格式中包含一个镜面反射颜色成分。

D3DFVF_NORMAL:表示顶点格式中包含有顶点朝向信息(即法线向量)。 D3DFVF_TEX0 ——D3DFVF_TEX8:包含顶点格式坐标的个数(1-8个)。 例如:

typedef struct SObjVertex

{

FLOAT x, y, z; // position

FLOAT nx, ny, nz; // normal

DWORD diffuse; // diffuse color

DWORD specular; // specular color

FLOAT tu, tv; // first pair of texture coordinates

FLOAT tu2, tv2, tw2; // second pair of texture coordinates

FLOAT tu3, tv3; // third pair of texture coordinates

FLOAT tu4, tv4; // fourth pair of texture coordinates

} SObjVertex;

const DWORD gSObjVertexFVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE |

D3DFVF_SPECULAR |

D3DFVF_NORMAL | D3DFVF_TEX4 |

D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE3(1) | D3DFVF_TEXCOORDSIZE2(2) | D3DFVF_TEXCOORDSIZE2(3));

IDirect3DDevice9::DrawPrimitive:

HRESULT DrawPrimitive(

D3DPRIMITIVETYPE PrimitiveType,

UINT StartVertex,

UINT PrimitiveCount

);

PrimitiveType:定义了要使用的图元的类型。共有六种:

typedef enum D3DPRIMITIVETYPE

{

D3DPT_POINTLIST = 1, //点,图元个数N

D3DPT_LINELIST = 2,//线,图元个数为N/2

D3DPT_LINESTRIP = 3,//

D3DPT_TRIANGLELIST = 4,

D3DPT_TRIANGLESTRIP = 5,

D3DPT_TRIANGLEFAN = 6,

D3DPT_FORCE_DWORD = 0x7fffffff,

} D3DPRIMITIVETYPE, *LPD3DPRIMITIVETYPE;

StarVertex:设置从顶点缓冲区中的第几个顶点画起。

PrimitiveCount:要绘画的图元的数量。

3. DrawPrimitive()

HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, 图元类型 UINT StartVertex, 起始顶点

UINT PrimitiveCount 要绘制的图元个数

);

完成上述过程就可以对定点进行渲染了。

渲染函数DrawPrimitive()不对顶点的格式进行再次检查:比如同一个缓冲区可以,你本来打算是用来画三角形列表,但也可以画直线,或者三角形带、扇形等,函数不会再次检查。

5. 使用顶点索引缓冲区

在一个3D模型中一个点可能要同时处于多个三角形面上,如果直接把顶点数据放进缓冲区,那么重复的顶点就会占用多余的内存。

使用顶点缓冲区把顶点的具体数据和代表三角形的顶点的索引分开存储,顶点数据还是放到顶点缓冲区中,顶点索引存储在顶点索引缓冲区中,这样可以节省不少内存,避免点的重复存储。

5.1 创建顶点索引缓冲区并填充之

使用到的函数:

1. HRESULT CreateIndexBuffer( UINT Length,

DWORD Usage,

D3DFORMAT Format,

D3DPOOL Pool,

IDirect3DIndexBuffer9** ppIndexBuffer,

HANDLE* pHandle ); 用于创建顶点索引缓冲区 UINT Length

顶点索引缓冲区的大小,有多少个索引,就有多少个顶点的字节大小;

DWORD Usage

可以置为0;

D3DFORMAT Format

D3DFMT_INDEX16,D3DFMT_INDEX32分别表示用16位(可存储65536个顶点),32位存(可存储65536*65536个顶点)储索引值。

D3DPOOL Pool

可取D3DPOOL_DEFAULT;

IDirect3DIndexBuffer9** ppIndexBuffer

顶点索引缓冲区的COM对象指针;

HANDLE* pHandle

一般值为NULL;

2. HRESULT Lock( UINT OffsetToLock,

UINT SizeToLock,

VOID **ppbData,

DWORD Flags ); 用于锁定顶点索引缓冲区并返回索引数据区指针;

UINT OffsetToLock

锁定偏移量,一般设置为0;

UINT SizeToLock

顶点索引缓冲区的字节数,等于顶点索引个数 * 索引位深 / 8;

VOID **ppbData

返回指向顶点索引缓冲数据区的指针,以便数据复制;

DWORD Flags

一般设置为0;

3. HRESULT Unlock (VOID);用于解除顶点索引缓冲区区

注意:一般手动填充顶点索引缓冲区,因为那几个顶点构成一个三角形有自己来确定;

5.2 将顶点索引缓冲区设置到渲染管道流水线

1. HRESULT SetIndices( IDirect3DIndexBuffer9 * pIndexData );

其中的pIndexData为指向顶点索引缓冲区COM对象的指针;

2. HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type,

INT BaseVertexIndex,

UINT MinIndex,

UINT NumVertices,

UINT StartIndex,

UINT PrimitiveCount );

D3DPRIMITIVETYPE Type,

图元类型;

INT BaseVertexIndex,

初始顶点的索引值的偏移量,一般为0;

UINT MinIndex,

最小顶点索引值,一般为0;

UINT NumVertices,

顶点缓冲区中的顶点数量;

UINT StartIndex,

起始的顶点索引,一般为0;

UINT PrimitiveCount

需要渲染的图元的个数;

顶点索引缓冲区中的顶点顺序很重要,因为默认情况下,流水线只绘制点排列顺序为逆时针的三角形,而不绘制排列顺序为顺时针的三角形(可以设置为NOCULL模式这样渲染管线不裁剪)。

包含D3DFVF_XYZRHW的点可以直接绘制在屏幕上,而不需要变换。这是因为生成一个包含D3DFVF_XYZRHW属性的VertexBuffer对象,渲染流水线会认为改点已经进行了顶点变换,不要再将顶点数据作变换(不乘世界矩阵,视矩阵,投影矩阵)。这是绘图时用的坐标系可以理解为简单的屏幕坐标系(即x正方向水平向左,y正方向竖直向下)

英文:The RHW float, when set to one, indicates that the vertice are not to be transformed. This is used for GUI developement. setting the RHW tells the direct3d pipeline NOT to apply any transformations matrices to them and you can think of them as pure 2d coords instead of 3d coords.

6. 摄像机

6.1 D3D中使用的几种常用的向量

常用的有以下几种:

1. D3DVECTOR定义在d3d9types.h头文件中,其为结构体,定义如下: typedef struct _D3DVECTOR {

float x, y, z;

} D3DVECTOR; D3DVECTOR属于3维向量。

2. D3DXVECTOR2定义如下:

typedef struct D3DXVECTOR2 {

FLOAT x;

FLOAT y;

} D3DXVECTOR2; D3DXVECTOR2属于2维向量。

D3DXVECTOR3定义如下:

typedef struct {

FLOAT x;

FLOAT y;

FLOAT z;

} D3DXVECTOR3; D3DXVECTOR3属于3维向量。

D3DXVECTOR4定义如下:

typedef struct D3DXVECTOR4 {

FLOAT x;

FLOAT y;

FLOAT z;

FLOAT w;

} D3DXVECTOR4; D3DXVECTOR4属于4维向量。

以上三者均在d3dxmath.h中定义(记忆方法同D3DCOLOR、D3DXCOLOR)。

6.2 D3D相机中使用的几种常用的关于向量的函数

1. D3DXVec3Dot ();

2. D3DXVec3Normalize ();

3. D3DXVec3Cross ();

4. D3DXMatrixRotationAxis ();

5. D3DXVec3TransformCoord ();

介绍:

1. FLOAT D3DXVec3Dot ( CONST D3DXVECTOR3 *pV1,

CONST D3DXVECTOR3 *pV2 );

该函数用于计算两个三维向量的点乘,并返回最终结果。

2. D3DXVECTOR3 * WINAPI D3DXVec3Normalize( D3DXVECTOR3 *pOut, CONST

D3DXVECTOR3 *pV );

该函数用于计算第二个向量的单位向量(即归一化向量),第二个参数为source即传入向量,并将计算结果存放于第一个参数中或返回。

3. D3DXVECTOR3 * D3DXVec3Cross( D3DXVECTOR3 * pOut,

CONST D3DXVECTOR3 * pV1, CONST D3DXVECTOR3 * pV2 ); 该函数用于计算后两个向量的叉乘,并将结果放于第一个参数中或返回。 4. D3DXMATRIX * D3DXMatrixRotationAxis ( D3DXMATRIX * pOut, CONST D3DXVECTOR3 * pV, FLOAT Angle );

D3DXMATRIX * pOut

根据旋转角度和转轴计算出来的绕pV轴旋转Angle弧度应使用的旋转矩阵。 CONST D3DXVECTOR3 * pV

用于定义旋转轴的向量。

FLOAT Angle

旋转过的弧度,因为实在左手坐标系中,所以顺时针转动为正。Angles are measured

clockwise when looking along the rotation axis toward the origin 5. 下面来看看D3DXVec3TransformCoord()函数:

D3DXVECTOR3 * D3DXVec3TransformCoord( D3DXVECTOR3 * pOut,

CONST D3DXVECTOR3 * pV, CONST D3DXMATRIX * pM ); 计算点pV经过矩阵pM旋转后的值,并将值放于pOut中或返回。

6.3 点和向量的区别

坐标和向量是有区别的:向量的第四维数值是0,坐标的第四维数值是1; 向量 = 两个坐标的差值 ,第四维同样做减法,结果是0;

向量的坐标变换用D3DXVec3TransformNormal, 点的变换用

D3DXVec3TransformCoord。

D3DXVec3Transform和D3DXVec3TransformCoord相似,区别在于后者变换后将w投射回1。

6.3 Camera相机矩阵计算问题

参见函数D3DXMatrixLookatLH()其最终计算出来的相机矩阵各个参数如下: D3DXMATRIX * WINAPI D3DXMatrixLookAtLH( D3DXMATRIX *pOut,

CONST D3DXVECTOR3 *pEye,

CONST D3DXVECTOR3 *pAt, CONST D3DXVECTOR3 *pUp );

Remarks

The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixLookAtLH function can be used as a parameter for another function.

This function uses the following formula(表达式) to compute the returned matrix.

cam_pos = eye.

cam_lookat = zaxis = normal(At - Eye) (在RH中为normal(Eye-At)) cam_right = xaxis = normal(cross(Up, zaxis))

cam_up = cross(zaxis, xaxis)

xaxis.x yaxis.x zaxis.x 0

xaxis.y yaxis.y zaxis.y 0

xaxis.z yaxis.z zaxis.z 0

-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1

7.基本纹理应用

7.1 纹理尺寸

纹理都是2D的图片,它可以保存为bmp、tga、jpg或是任何一种常见的图片格式,所以它肯定有大小。虽然理论上现在的新型显卡可以支持任意尺寸的纹理,不过为了兼容以前的显卡也为了程序的执行效率,你最好把纹理的尺寸做成2的n次方。如:16 x 16, 32 x 32, 64 x 64, 128 x 128, 256 x 256等等。

7.2 纹理坐标

纹理坐标又叫贴图坐标,在D3D中用两个0到1的浮点值(U,V)来设置一个点的纹理坐标,U是横轴、V是纵轴。纹理的左上角为(0,0),右下角为(1,1)。

7.3 基本纹理添加步骤以及所使用的函数

1. 为顶点添加纹理坐标u、v并修改顶点的FVF

2. 定义纹理对象指针并创建纹理对象。

如: LPDIRECT3DTEXTURE9 ppTexture; // 定义纹理对象指针

HRESULT D3DXCreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,

LPDIRECT3DTEXTURE9 * ppTexture ); LPDIRECT3DDEVICE9 pDevice, // 设备对象

LPCTSTR pSrcFile, // 待作为纹理的图像名称

LPDIRECT3DTEXTURE9 * ppTexture ); // 纹理对象指针

3. 将纹理设置到渲染管线并渲染

1. HRESULT SetTexture( DWORD Sampler, //将一张纹理指派给设备中的某个特定的阶段

IDirect3DBaseTexture9 * pTexture) //纹理对象指针

SetTexture()方法将一张纹理指派给设备中的某个特定的阶段。Direct3D提供了8个阶段(0到7),这意味着可以为一次DrawPrimitive()调用同时设置最多8张纹理。(然而,你也可以多次调用DrawPrimitive(),这称“多次渲染”)。SetTexture()的第一个参数中给出一个希望使用的纹理阶段编号。第二个参数为纹理对象指针。

当一个应用程序选择了一张纹理作为当前纹理时,它就指示Direct3D设备在下一次改变当前纹理之前,一直将该纹理应用到所有被渲染的图元上去。如果3D场景中的每个图元都有其自己的纹理,则必需在绘制每个图元之前设置相应的纹理,也就是说应在调用DrawPrimitive()函数之前进行纹理设置。

2. HRESULT SetTextureStageState( DWORD Stage, //持有该纹理接口的纹理阶段号。

D3DTEXTURESTAGESTATETYPE Type, //纹理状态类型

DWORD Value //指定纹理状态类型的值 );

SetTextureStageState()可用于在不同的材质(material)之间对颜色和alpha作混合。可用它来指定Direct3D纹理引擎的操作和参数。首先应选择想要使用的纹理,在第一个参数中给出持有该纹理接口的纹理阶段号。第2个参数用来设置纹理状态类型。

8.模型加载

1.装载模型

模型加载函数一般使用D3DXLoadMeshFromX( )将模型加载到内存(笼统说法)中:

HRESULT WINAPI D3DXLoadMeshFromX( LPCTSTR pFilename, //.x文件名称

DWORD Options, //Mesh存储内存类型

LPDIRECT3DDEVICE9 pD3DDevice, //设备对象

LPD3DXBUFFER *ppAdjacency, //一般设为NULL

LPD3DXBUFFER *ppMaterials, //材质扩展对象结构指针

LPD3DXBUFFER *ppEffectInstances, //特效对象

DWORD *pNumMaterials, //纹理数目(等于材质数目)

LPD3DXMESH *ppMesh ); //Mesh对象指针。

2.填充纹理和材质

注意D3DXLoadMeshFromX( )函数中的LPD3DXBUFFER,其结构为:

typedef interface ID3DXBuffer ID3DXBuffer;

typedef interface ID3DXBuffer * LPD3DXBUFFER;

ID3DXBuffer——COM对象其成员函数LPVOID GetBufferPointer(VOID)用于返回扩展缓冲区数据区指针。

在D3DXLoadMeshFromX()中LPD3DXBUFFER * 类型的ppMaterials是材质扩展结构对象的定义如下:

typedef struct D3DXMATERIAL {

D3DMATERIAL9 MatD3D ; //Mesh的材质结构体

LPSTR pTextureFilename ; //Mesh纹理图片对应的名字 } D3DXMATERIAL;

它存储了一个Mesh的所有纹理(纹理只包含作为纹理图片的名字)和材质,由于D3DXMESH并没有为什么提供模型的材质和纹理管理,所以必须自己做这件事情。将纹理和材质填充到数据区。

这就需要将D3DXMATERIAL 结构中的数据自己写入到D3DMATERIAL 9和材质对象中;

3.渲染

一切准备就绪,渲染吧。要注意,在.x文件被读入时,模型是被切分了的,每一个材质对应一部分的模型。

// 根据材质的数量我们的模型被切分了,每个材质对应一部分,即材质被分为几部分,就按几部分渲染。

for( DWORD i=0; i<g_dwNumMaterials; i++ )

{ // 为这一部分设置材质

g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] );

g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );

// 渲染这一部分

g_pMesh->DrawSubset( i );

}

注:在最后别忘了将材质对象数组释放:

for( DWORD i=0; i<g_dwNumMaterials; i++ )

{

SafeRelease(g_pMeshTextures[i]);

}

更多相关推荐:
课程设计(任务计划书)

吉林建筑大学城建学院课程设计任务书题目名称基于单片机的抢答器设计院系电气信息工程系课程名称单片机课程设计班级学号李林学生姓名110090121指导教师杨晓慧起止日期20xx7720xx718课程设计任务书进度计...

课程设计任务计划书模板

课程设计任务书题目学院专业班级学生姓名学号月日至月日共周指导教师签字院长签字年月日

电子技术课程设计计划书、课程设计报告

电子技术课程设计计划书一课程设计的总体目标电子技术课程是一门专业技术基础课电子技术课程设计是电子技术课程理论教学之后的一个实践教学环节其目的是训练学生综合运用学过的电子技术原理的基础知识独立进行查找资料选择方案...

《管理信息系统》课程设计计划书

管理信息系统课程设计计划书一目的课程设计是与课程管理信息系统相配合的设计性实验课程设计主要目的1通过系统分析使学生建立对管理信息系统的认识2通过对某小型管理信息系统的分析使学生掌握管理信息系统的主要步骤和方法提...

JAVA 课程设计计划书

JAVA程序设计基础课程设计计划书课程编码课程名称JAVA程序设计基础适用专业软件工程计算机科学与技术通信工程所属学科计算机科学课程性质必修学时学分2分先修课程计算机应用基础C程序设计数据结构后续课程WEB程序...

《数据结构》课程设计计划书

数据结构课程设计计划书班级20xx信计专业授课教师马阿曼一课程设计目的数据结构课程是计算机科学与技术专业的核心专业基础课本课程设计的目的是将数据结构理论和实践结合起来锻练学生编写程序过程中的数据结构使用和分析解...

20xx课程设计计划书17-18周

华北水利水电学院课程设计任务书及计划书20xx20xx学年第二学期环节名称高级语言课程设计学生专业班级信息20xx16820xx170指导教师杨雪青王卉院系信息工程学院教研室计算机基础教研室课程设计任务书课程设...

如何安排课程设计

摘要课程设计Curriculumdesign是课程领域里经常使用的术语之一但也是一个界定不清晰的术语尤其是在与课程编制Curriculumconstruction的区分上不同的课程研究者有着不同的认识和理解课程...

Java课程设计计划书_制作简单的日历

Java课程设计计划书院系专业年班设计人1一课程设计题目2二目的2四效果2六用到的包3七源程序代码3八效果截图8九指导教师9十参考文献9一课程设计题目制作简单的日历二目的1培养独立的Java语言与算法设计方法具...

20xxC语言课程设计计划书

华北水利水电学院课程设计任务书及计划书20xx20xx学年第一学期环节名称学生专业班级20xx统计学指导教师张贞贞闫雒恒皇甫中民院系教研室计算机基础教研室课程设计任务书课程设计计划书注指导教师在课程设计期间每天...

数据结构与算法课程设计计划书

计算机科学与工程学院集中性实践教学计划书20xx20xx学年第二学期课程名称数据结构与算法课程设计专业计算机科学与技术软件工程网络工程班级计算机科学与技术0916软件工程0914网络工程0914课程负责人李锡祚...

课程建设规划

课程建设规划20xx年课程建设规划一学校概况始建于19xx年是一所全日制公办初级中学学校占地面积16742平方米校舍建筑面积9344平方米有1栋教学楼1栋综合办公楼1栋实验楼1栋教师宿舍楼2栋学生宿舍楼图书室阅...

课程设计计划书(34篇)