DirectX实验八.X file和Camera
- 格式:doc
- 大小:137.00 KB
- 文档页数:9
第十三章:声音和音乐Introduction (序)这一章我们学习怎样用DX来播放声音和音乐。
我们将会使用DirectX Audio来播放WAV和MIDI文件,使用DirectShow来播放MP3文件。
此章我们仍然有一个简单的程序作例子,它会播放MP3的背景音乐,当用户用鼠标点击某个数字时它会播放一些音效。
DirectX Audio and DirectShow (DirectX Audio和DirectShow)我们已经学习过Direct3D和DirectInput了,现在,我要介绍另外两个DirectX组件:DirectX Audio和DirectShow。
我们用DirectX Audio来播放WAV和MIDI文件;用DirectShow来播放媒体流,例如AVI和MP3。
在此教程中,我们只学习一下用DirectShow播放MP3的方法。
Wav, Midi and Mp3 - When should I use what?(WAV,MIDI和MP3——什么时候该用什么?)那末,什么时候用什么格式好呢?嗯,这基本上取决于你的个人爱好。
下面是这些格式的简介,过后我会说一下我的选择:Wav files (WAV文件)WAV是一种未经压缩的数字音频,CD音质,但是体积非常庞大。
Midi files (MIDI文件)MIDI文件并没有保存音频记录,它实际上更像是一套演奏指令,所以,它的体积是非常小的。
MIDI的音质完全取决于演奏设备(如我们的声卡),它在高端的设备上能表现出色,而在低端设备上则表现较差。
Mp3 files (MP3文件)同WAV文件一样,MP3也是一种数字音频格式。
不同的是,MP3文件是经过压缩的,而且是有损压缩,这意味着它的体积将大大地减小,而音质上将会有一些失真(实际上接近CD 音质,基本听不出失真)。
而且,MP3是一种媒体流,这意味着在播放它的时候不会将它整个的读入,取而代之的是分期的做部分读入。
实验二DirectX渲染及图形绘制实验实验报告项目1:DirectX渲染管道实验在例程Cub的基础上,完成以下步骤:1.修改Display函数中物体的旋转变换矩阵,使三维模型不再旋转。
2.修改摄像机位置坐标、观察点坐标、向上向量的值,记录以下状态时的值:a)远距离拍摄。
b)近距离拍摄。
c)平面旋转90度。
3.修改变换矩阵的创建参数,即D3DXMatrixPerspectiveFovLH()函数的参数,观察并记录以下参数对应的画面:a)近平面距离设为1000,远平面距离设为1000。
b)近平面距离设为1,远平面距离设为5。
c)近平面距离设为1,远平面距离设为1000。
d)宽高比:(float)width*1.5/(float)heighte)宽高比:(float)width*0.5/(float)heightf)宽高比:(float)width/(float)height1、修改Display函数中物体的旋转变换矩阵,使三维模型不再旋转。
操作截图如下:修改后的运行结果截图如下:2、修改摄像机位置坐标、观察点坐标、向上向量的值,记录以下状态时的值:a) 远距离拍摄。
操作代码:运行结果:b)近距离拍摄。
操作代码:运行结果:c) 平面旋转90度。
操作代码:运行结果:3、修改变换矩阵的创建参数,即D3DXMatrixPerspectiveFovLH()函数的参数,观察并记录以下参数对应的画面:(在第二步的基础上)a) 近平面距离设为1000,远平面距离设为1000。
操作代码:结果窗口画面一片空白。
b) 近平面距离设为1,远平面距离设为5。
操作代码:运行结果:c) 近平面距离设为1,远平面距离设为1000。
操作代码:结果与上图一样。
d) 宽高比:(float)width*1.5/(float)height操作代码:运行结果:e) 宽高比:(float)width*0.5/(float)height 操作代码:运行结果:g) 宽高比:(float)width/(float)height操作代码:运行结果:项目2:DirectX图形绘制实验在例程Cub的基础上,完成以下步骤:1.修改8个顶点中任一个一个顶点的值,观察并记录画面。
内容摘自《DirectX 9.0 3D 游戏开发编程基础》章节一.1.必备数学知识二.1.初始化Direct3D2.(固定)绘制流水线3.Direct3D 中的绘制4.颜色5.光照6.纹理映射7.融合技术8.模板三.9.字体10.网格(一)11.网格(二)12.自定义Camera 类13.地形绘制14.粒子系统15.拾取四.16.着色语言HLSL17.顶点着色器18.像素着色器19.效果框架一.1.必备数学知识1.1向量及坐标系选取,D3D 中以LH/RH 标记左手/右手坐标系。
1.2向量运算:数乘点积-用于计算两个向量的夹角(cos θ)及判断向量垂直。
叉积-计算与两个向量所在平面垂直的向量,可用于面片法向量的计算。
1.3矩阵:在3D 图形应用中,常用4X4矩阵和1X4行向量进行运算。
由于多数变换无法用3阶矩阵表示3维变换,因此3D 变换中的矩阵为4维矩阵。
由于3维坐标空间中点和向量具有相同的表示形式,因此在进行运算时,将点和向量扩展至4D 空间时,通过如下形式:123(,,,1)p p p p =表示点(保证能平移变换);以123(,,,0)v v v v =表示向量(防止平移变换)。
1.4 3维空间中的变换:平移矩阵、旋转矩阵、比例变换矩阵1.5平面D3DXPLANE 在D3D 中存储平面及相应操作。
平面定义为满足0()0n p p ∙-=的所有点的集合,因此可通过平面法向量n 和平面上一点0p 表示,在代码中存储n 和0d n p =-∙表示平面;平面可被看做4D 向量(n,d )进行变换;当平面被规范化(法向量为单位向量且重新计算d ),则n p d ∙+为p 点到平面的最短有符号距离。
1.6射线定义为0()p t p tu =+。
射线与平面的相交判定用于拾取的实现。
二.1. 初始化Direct3D1.1 Direct3D 提供了操纵图形设备(通过HAL 硬件抽象层)的API 。
由HAL 提供的硬件支持的功能可被D3D 接口操作;硬件不支持时由REF 设备实现,由D3DDEVTYPE 枚举类型成员指定。
unity camera 使用原则Unity中的相机(Camera)是用于渲染游戏场景的重要组件,能够控制角度、位置和视野等参数。
相机的使用原则包括以下几个方面:1. 相机适配:根据游戏的需求选择合适的相机适配方式。
主要包括正交投影(Orthographic)和透视投影(Perspective)两种模式。
正交投影适用于2D游戏,对于需要视觉深度的3D游戏则需要使用透视投影。
2. 相机位置:相机的位置决定了玩家在游戏中所看到的场景。
要根据游戏的特点设置相机的初始位置,例如FPS游戏需要将相机放在玩家的视角处,而策略游戏可以将相机放在地图的上方。
3. 相机角度:相机的旋转角度也非常重要,能够改变玩家对游戏场景的观感。
可以根据游戏中的需要对相机进行旋转,例如第三人称射击游戏中的过肩视角。
4. 相机移动:相机的移动可以让玩家在游戏场景中看到不同的位置。
可以采用平滑移动的方式,例如玩家控制角色在场景中移动时,相机也跟随角色的移动,以保持玩家的观察焦点。
5. 相机视野:通过改变相机的视野(Field of View, FOV)可以调整玩家所看到的画面范围。
较小的视野会使画面显得更加扁平,适用于需要强调远景的游戏场景;而较大的视野会增加近景的拉近感,适用于需要更广阔视野的游戏场景。
6. 多相机使用:有时候需要多个相机来呈现不同的画面或视角。
例如在实时策略游戏中需要同时显示多个视角,此时可以使用多相机来分别渲染不同的视角。
7. 相机跟踪目标:在某些场景中,相机需要跟踪游戏中的物体或角色。
可以通过编写脚本来实现相机的跟踪功能,例如跟踪角色的移动、旋转或者某个物体的运动。
8. 相机剪裁:相机可以设置剪裁区域,只渲染指定区域内的物体。
这样可以提高渲染效率,减少不必要的渲染开销。
9. 相机特效:Unity中提供了多种内置的相机特效,例如景深(Depth of Field)、快门(Shutter)和屏幕后处理(Post-processing),可以通过添加这些特效来增强游戏画面的表现力。
DirectX 8 教程著 Andy Pike译 Aman JIANG 第一章: 准备就绪What you will need(你需要什么)∙DirectX 8.0 SDK (可以从/directx下载)∙VC6(SP5)/∙Windows 程序设计经验∙通晓 C++ 和OOPIntroduction(序)(原著的话)欢迎阅读本DX教程。
本教程至少能帮你入门、使你了解怎样用DX8 来开发Windows游戏。
我写这个教程的原由有二:首先,当出现DX时,我还是一个初学者。
所以,我想边学习边写一个教程来锻炼自己。
其次,对初学者来说,DX SDK 并不是很有帮助。
而且,网上也没有什么像样的Dx8教程。
另外,就像上面我提到的,我也是个初学者,所以,如果你发现教程中有什么地方不对,请给我写信:webmaster@。
译者言我也是一名初学者,所以,有言在先:如果你读英文能如履平地,建议你还是去读原著。
此教程很适合入门,等你入门以后,你会发现,其实一切并没有想象的那样复杂。
这是个不错的Dx8教程,我会尽最大努力把它翻译好。
注:我并没有完全按照原著来译,不适之处,请多包涵。
嗯,你应该弄到教程附带的源代码,没有那个可不行!可以到去下载。
欢迎指出我的错误,或与我联系,我的Email:Chaoyu_JIANG@ or Aman_JIANG@ , QQ:15852673。
COMWhat is COM? COM 是什么呢?COM 就是 Component Object Model, 组件对象模型。
COM 接口和C++的抽象类相似(但不一样),就像抽象类没有与之相关的实际代码一样,COM描述了一套符号和语法而非实现过程。
你也可以把 COM 对象就想象成一套为某个主题而设计的一整套库函数。
DX 就提供了一套完整的设计3D游戏的库。
最棒的就是,使用DX时,你不必去直接接触硬件,而由DX帮你代理了。
这使得一些事情变得简单了。
使用 COM 时应该注意,必须在程序结束前释放所有的 COM 对象(或接口)。
实验四DirectX光照、材质和纹理实验报告项目1:DirectX材质和光照实验在例程Cube的基础上,完成以下步骤:1)实现平行光照明。
2)黄色材质设定。
3)增加一个蓝色点光源。
在实验过程中注意灯光设置的方向、颜色等参数设定。
1)实现平行光照明2)黄色材质设定在头文件d3dUtility.h中添加光照的函数等等d3dUtihty.h 卡x d3dUtihty.cpp cube.cpp5] Cube(} d3d50delete t:51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71+ = U;constconstconstconstconstconstconstconstD3DKCOLOR WITH 二D3DCOLOR_KRGB (255, 255, 255); D3DKCOLORBLACK = D3DCOLOR.XRGE(0, 0, 0):D3DXCOLOR RED = D3DCOLOR_XRGB(255,山0):D3DXCOLOR GREEN 二D3DCOLOR_KRGB(0, 255, 0);D3DKCOLOR BLUE 二D3DCOLOR_KRGB(0, 0, 255);D3DKCOLOR YELLOW = D3DCOLOR_KRGB(255, 255, 0);D3DKCOLOR CYAN = D3DCOLOR_KRGB (0, 255, 255::':D3DXCOLOR WENTA = D3DCOLOR_XRGB (255, 0, 255);//LightsD3DLIGHT9 InitDirect ionalLight(D3DXVECTOR3* direct ion, D3DXCOLOR* color);D3DLIGHT9 InitPointLight(D3DKVECTOR3* position, D3DKCOLOR* culur);D3DLIGHT9 InitSpotLight (D3DXVECTOR3* posit ion, D3DKVECTOR3* direction, D3DKCOLOR* culur): //MaterialsD3DMATERIAL"mitMlHL(D3DXCQLaR 瓦D3DXC0L0R d. D3风COLOR 毎D3DXCQL0R 巳floatd3dUtility.h -f X ® Cube596061626364656667686970717273747576777879dSdUtihty.cpp cube.cpp~ O d3d Tconst D3DKCOLOR YELLOW = D3DCOLOR_KRGB(255, 255, 0): constD3DXCOLOR CYAN = D3DCOLOR_XRGB(0, 255, 255): const D3DXCOLORJIAGENTA = D3DCOLOR_XRGB (255, 0, 255)://LightsD3DLIGHT9 ImtDirect ionalLight (D3DKVECTOR3* direct ion, D3DKCOLOR* cclur):D3DLIGHT9 InitPointLight(D3DXVECTOR3* positlun, D3DXCOLOR* culur);D3DLIGHT9 InitSpotLight(D3DXVECTOR3* posit ion, D3DXVECTOR3* direct ion, D3DXCOLOR* color)://MaterialsD3DMATERL虬9 InitJiItrl (D3DKCOLOR a, D3DKCOLOR d, D3DKCOLOR * D3DKCOLOR 土float P);const D3DMATEEL虬9 TOITE_MTF1 = InitMtrl (:WTE_, WHITE.. TOITE., BLACK, 2. Of): constD3DMATERIAL9 RH)_MTRL = InitMt rl (FED, RED, RED, BLACK, 2. Of);const D3DMATEEL虬9 GEEE1LMTRL = InitMtrl (:GF£EN, GREEN, GEEEM, BLACK, 2. Of);const D3DMATEE:UL9 BLUE_MTF1 = InitMtrl (BDJE., BLUE., BLUE., BLACK, 2. Of):const D3DMATERIAL9 YELLOW项TRL = InitMtrl(YELLOW, YELLOW, YELLOW, BLACK, 2.Of);在源文件d3dUtility.cpp中添加光源ID3DLIGHT9 d3d::InitDirectionalLight(D3DKVECTOR3+ direction, D3DKCOLOR* color){D3DLIGHT9 light:::ZeroMemory t&lightj sizeof(light));light.Type = D3DLIGHT_DIRECTIONAL;light. Ambient = *color * 0.6f:light. Diffuse = *color:light. Specular = *color * 0. 6f:light. Direction = *direct ion;return light;.}I d3d::InitPointLight(D3DKVECTORS* position, D3DKCOLOR* color){D3DLIGHT9 light:::ZeroMemory(flightj sizeof(light));light. Type = D3DLIGHT_POINT:light. Ambient = *color * 0. 6f:light. Diffuse = *color:light. Specular = *color * 0.6f;light. Posit ion 二*posit ion:light. Range = 1000.Of:light. Falloff = 1. Of;1 i ght. At t enuat i on0 = 1. Of ;light. Attenuationl = 0. Of:light. Attenuation2 = 0. Of;return light:}D3DLIGHT9 d3d::InitSpotLight(D3DKYECTOR3* position, D3DKYECTOR3* direction, D3DKCOLOR* color) { D3DLKHT9 light:::ZeroMemory(felightj sizeof(light));light.Type = D3DLIGHT_SPOT;light. Ambient = *color * 0. Of:light.Diffuse = *color:light.Specular = *color * 0. 6f:light.Posit ion = *posit ion:light. Direct ion = *direction;light. Range = 1000.Of:light. Falloff = 1. Of;1 i ght. At t enuat i onO = 1. Of ;light. Attenuationl = 0. Of :1 ight. Att enuat ion2 = 0. Of :light. Theta = 0. 4f :light.Phi = 0. 9f;return light;) {-D3DMATEEIAL9 d3d::InitMtrl(D3DKC0L0R 头D3DXC0L0R d, D3DXC0L0R * D3DXC0L0R * floatP D3DMATERIAL9 mtrl;mt rl. Ajribient = a;mtrl.Diffuse = d;mtrl. Specular = s ;mtrl. Emissive =已;mtrl. Power = p :return mtrl:在源文件cube.cpp中修改和添加相关内容首先使立方体住手旋转//y += timeDelta;然后改一串代码const DWORD VerteK::FVF = D3DFVF_KYZ|D3DFVF_N0R]UL;接下来在bool Setup函数中作如下代码□ bool Setup (){//Turn on lightsDevice->SetRenderState(D3DRS_LIGHTINGj true): El //// Create vertex and index buffers.//Creat and set the mat erialD3DMTERIAL9 mtrl;mt rl. Ambient = d3d: : YELLOW:d3d::YELLOW;d3d: : YELLOW:d3d: : BLACK :D 即i c 已- > S et Mat 日r i al (&mt r 1) ;//Setup a directional lightD3DLIGHT9 dir;::ZeroMemory(^dirj sizeof(dir)): dir.Type = D3DLIGHT_DIRECTZONAL: dir.Diffuse = d3d::WHITE;dir. Specular = d3d::VHITE * 0. 3f;dir. Ambient = d3d::WHITE *0.6f:dir. Direct ion = D3DKVECTOR3(1. Of, 0.Of, 0.Of);Device->SetLight (Cl, &dir);Device->LightEnable(0j true);Device->SetRenderState(D3DRS_NOEMALIZENORMAL* true);Device->SetRenderState(D3DRS_SPECULARENABLEj t rue);注释与修改两串代码mtrl.Emissive = d3d::BLACK; 运行结果如下然后改变光的方向Directs D 9 A.pp3)增加一个蓝色点光源//Setup a directional light D3DKVECTOR3 posd.Of, 1. Of, 0. Of): D3DKCOLOR c = d3d::GREEN;D3DLIGHT9 point = d3d::InitPointLight(^pos^ ; // Set and Enable the light.Device->SetLight(1』^point); Device->LightEnable(15true);D3DLIGHT9 dir;::ZeroMemory sizeof(dir)); dir.Type = D3DLIGHT_DIEECTIONAL;dir. Diffuse = d3d::RED:dir. Specular = d3d::RED * 0.3f;dir. Ambient = d3d::RED * 0.6f;dir. Direction = D3DKVECTOR3 (1.Of, 0.Of, 0.Of);项目2:DirectX纹理实验在项目1的程序基础上完成一下步骤:1)新增一个立方体增加纹理,图片请自己准备。
directx中文手册1、什么是DirectX ?微软的DirectX软件开发工具包(SDK)提供了一套优秀的应用程序编程接口(APIs),这个编程接口可以提供给你开发高质量、实时的应用程序所需要的各种资源。
DirectX技术的出现将极大的有助于发展下一代多媒体应用程序和电脑游戏。
总的说来,使用DirectX的主要有两个好处:1、为软件开发者提供硬件无关性;2、为硬件开发提供策略。
1、为软件开发者提供硬件无关性微软开发DirectX,其最主要的目的之一是促进在Windows操作系统上的游戏和多媒体应用程序的发展。
在DirectX出现以前,主要的游戏开发平台是MS-DOS,游戏开发者们为了使他们的程序能够适应各种各样的硬件设备而绞尽脑汁。
自从有了DirectX,游戏开发者们便可以获益于Windows平台的设备无关性,而又不失去直接访问硬件的特性。
DirectX主要的目的就是提供象MS-DOS一样简洁的访问硬件的能力,来实现并且提高基于MS-DOS平台应用软件的运行效果,并且为个人电脑硬件的革新扫除障碍。
另一方面,微软公司开发DirectX是为了在当前或今后的计算机操作系统上提供给基于Windows平台的应用程序以高表现力、实时的访问硬件的能力。
DirectX在硬件设备和应用程序之间提供了一套完整一致的接口,以减小在安装和配置时的复杂程度,并且可以最大限度的利用硬件的优秀特性。
通过使用DirectX所提供的接口,软件开发者可以尽情的利用硬件所可能带来的高性能,而不用烦恼于那些复杂而又多变的硬件执行细节。
一个高表现力的基于Windows平台的游戏将得益于以下几种技术:专为提高图形运算及快速反应能力而设计的加速卡(Accelerator cards)即插即用以及其它Windows软硬件内建于Windows的通信服务, 包括DirectPlay2、为硬件开发提供策略DirectX的另外一个重要的目的是给硬件厂商提供开发策略,他们可以从高性能程序的开发者和独立的硬件供应商(independent hardware vendors IHVs)那里得到反馈。
数码相机型号CT 机实验内容及步骤1. 检查连线是否正确,打开 X-ray 仪器电源,打开相机电源,电脑开机2. 打开小青蛙图标CT 测量软件,注意成像的所有参数都需要在软件上调节3. 相机Camera 调试:1)像素点校正Defective pixels黑底校正:关闭Xray ,点击Identify defective pixels using dark and/or white frame2)平场校正flat-field correction打开Xray ,点击Create reference for flat-field correction ,等到5幅图像,再点击一次Create reference for flat-field correction4. 做小青蛙等的CT 成像1)关闭Xray ,放上样品青蛙标本2)在D 盘建立自己的文件夹检查Image Adjustment and Calibration 参数,如图1所示。
调整Distortion correction,Horizontal shift, Vertical shift, Size offluorescent screen, Vertical shift of screen 使得并且使后两者大小相等。
3)粗测:设置投影值projections 等参数如图2所示:注意扫描一副CT 图像的时间:180个投影值的采集时间约为 4.5min ,720个投影值采集时间最长约为20min5)按 开始扫描6)扫描结束后,观察3D 图像:改变强度、透明度Intensity andTransparency 和窗口Visible range ,可以观察到青蛙皮肤,肌肉和骨骼7)细测:如果粗测的清晰度不够,可以增大投影值等参数再扫描,之后重复步骤6)8)对清晰的青蛙CT 图可以定量测量脊椎骨直径和小脚趾的粗细尺寸 9)可以参用功能和偏振眼镜观察青蛙的3D 立体图像10)运用图像后处理技术可以对青蛙CT 图放大、旋转,各个方向切片观察等等11)选择合适观察角度和方位等有代表性的图像保存Bitmap 图像(Save as Bitmap…)12) 选测:可以对LEGO 积木成像,保存所选图像5. 选作实验内容本型号仪器可以测量铝片吸收系数,具体步骤请参考实验讲义 图1 图2。
实验八.X file和Camera一、实验内容:项目1:结合第11章的内容和第12章的内容创建三维场景,使用.x文件创建三维场景。
并实现在场景中漫游。
截图代码:bool Setup(){HRESULT hr = 0;//// Load the XFile data.//ID3DXBuffer* adjBuffer = 0;ID3DXBuffer* mtrlBuffer = 0;DWORD numMtrls = 0;hr = D3DXLoadMeshFromX("bigship1.x",D3DXMESH_MANAGED,Device,&adjBuffer,&mtrlBuffer,0,&numMtrls,&Mesh);if(FAILED(hr)){::MessageBox(0, "D3DXLoadMeshFromX() - FAILED", 0, 0);return false;}//// Extract the materials, and load textures.//if( mtrlBuffer != 0 && numMtrls != 0 ){D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();for(int i = 0; i < numMtrls; i++){// the MatD3D property doesn't have an ambient value set// when its loaded, so set it now:mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;// save the ith materialMtrls.push_back( mtrls[i].MatD3D );// check if the ith material has an associative textureif( mtrls[i].pTextureFilename != 0 ){// yes, load the texture for the ith subsetIDirect3DTexture9* tex = 0;D3DXCreateTextureFromFile(Device,mtrls[i].pTextureFilename,&tex);// save the loaded textureTextures.push_back( tex );}else{// no texture for the ith subsetTextures.push_back( 0 );}}}d3d::Release<ID3DXBuffer*>(mtrlBuffer); // done w/ buffer//// Optimize the mesh.//hr = Mesh->OptimizeInplace(D3DXMESHOPT_ATTRSORT |D3DXMESHOPT_COMPACT |D3DXMESHOPT_VERTEXCACHE,(DWORD*)adjBuffer->GetBufferPointer(),0, 0, 0);d3d::Release<ID3DXBuffer*>(adjBuffer); // done w/ bufferif(FAILED(hr)){::MessageBox(0, "OptimizeInplace() - FAILED", 0, 0);return false;}//// Set texture filters.//Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);//// Set Lights.//D3DXVECTOR3 dir(1.0f, -1.0f, 1.0f);D3DXCOLOR col(1.0f, 1.0f, 1.0f, 1.0f);D3DLIGHT9 light = d3d::InitDirectionalLight(&dir, &col);Device->SetLight(0, &light);Device->LightEnable(0, true);Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);Device->SetRenderState(D3DRS_SPECULARENABLE, true);//// Set projection matrix.//D3DXMATRIX proj;D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI * 0.5f, // 90 - degree(float)Width / (float)Height,1.0f,1000.0f);Device->SetTransform(D3DTS_PROJECTION, &proj);return true;}void Cleanup(){d3d::Release<ID3DXMesh*>(Mesh);for(int i = 0; i < Textures.size(); i++)d3d::Release<IDirect3DTexture9*>( Textures[i] ); }bool Display(float timeDelta){if (camera == 0){TheCamera.walk(-4.0f * 5);camera = 1;}if( Device ){if( ::GetAsyncKeyState('W') & 0x8000f )TheCamera.walk(4.0f * timeDelta);if( ::GetAsyncKeyState('S') & 0x8000f )TheCamera.walk(-4.0f * timeDelta);if( ::GetAsyncKeyState('A') & 0x8000f ) TheCamera.strafe(-4.0f * timeDelta);if( ::GetAsyncKeyState('D') & 0x8000f ) TheCamera.strafe(4.0f * timeDelta);if( ::GetAsyncKeyState('R') & 0x8000f ) TheCamera.fly(4.0f * timeDelta);if( ::GetAsyncKeyState('F') & 0x8000f ) TheCamera.fly(-4.0f * timeDelta);if( ::GetAsyncKeyState(VK_UP) & 0x8000f ) TheCamera.pitch(-1.0f * timeDelta);if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f ) TheCamera.pitch(1.0f * timeDelta);if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f ) TheCamera.yaw(-1.0f * timeDelta);if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f ) TheCamera.yaw(1.0f * timeDelta);D3DXMATRIX V;TheCamera.getViewMatrix(&V);Device->SetTransform(D3DTS_VIEW, &V);//// Update: Rotate the mesh.//static float y = 0.0f;D3DXMATRIX yRot;D3DXMatrixRotationY(&yRot, y);//y += timeDelta;if( y >= 6.28f )y = 0.0f;D3DXMATRIX World = yRot;Device->SetTransform(D3DTS_WORLD, &World);//// Render//Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);Device->BeginScene();for(int i = 0; i < Mtrls.size(); i++){Device->SetMaterial( &Mtrls[i] );Device->SetTexture(0, Textures[i]);Mesh->DrawSubset(i);}Device->EndScene();Device->Present(0, 0, 0, 0);}return true;}//// WndProc//LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){switch( msg ){case WM_DESTROY:::PostQuitMessage(0);break;case WM_KEYDOWN:if( wParam == VK_ESCAPE )::DestroyWindow(hwnd);break;}return ::DefWindowProc(hwnd, msg, wParam, lParam);}//// WinMain//int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE prevInstance,PSTR cmdLine,int showCmd){if(!d3d::InitD3D(hinstance,Width, Height, true, D3DDEVTYPE_HAL, &Device)) {::MessageBox(0, "InitD3D() - FAILED", 0, 0);return 0;}if(!Setup()){::MessageBox(0, "Setup() - FAILED", 0, 0);return 0;}d3d::EnterMsgLoop( Display );Cleanup();Device->Release();return 0;}。