1、动漫游戏开发技术习题集1.向量有哪些重要属性?举例说明,在3D游戏中向量的作用。向量的两个重要属性是长度和方向。在3D游戏中可以表示例子的速度和加速度,光线的走向,多边形的朝向。2.向量的数学表示方法以及在D3D中采用何种结构体来表示一个三维向量。数学表示方法:N=(Nx,Ny,Nz)。D3D中 typedef struct D3DVECTORfloat x,y,z; D3DVECTOR;3.向量长度的计算方法以及如何在D3D中计算向量的长度。|u|=sqrt(Ux*Ux+Uy*Uy+Uz*Uz)在D3D中, FLOAT D3DXVec3Length(CONST D3DVECTOR3 *pV)
2、;D3DXVECTOR3 v(1.0f, 2.0f, 3.0f); float magnitude = D3DXVec3Length( / = sqrt(14)4.向量的加、减,数乘、点积、叉积运算方法,并用简单的程序实现上述运算。;D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);D3DXVECTOR3 v(0.0f, -1.0f, 5.0f);/ (2.0 + 0.0, 0.0 + (-1.0), 1.0 + 5.0)D3DXVECTOR3 sum = u + v; / = (2.0f, -1.0f, 6.0f)D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);
3、D3DXVECTOR3 v(0.0f, -1.0f, 5.0f);D3DXVECTOR3 difference = u - v; / = (2.0f, 1.0f, -4.0f)D3DXVECTOR3 u(1.0f, 1.0f, -1.0f);D3DXVECTOR3 scaledVec = u * 10.0f; / = (10.0f, 10.0f, -10.0f)FLOAT D3DXVec3Dot( / Returns the result.CONST D3DXVECTOR3* pV1, / Left sided operand.CONST D3DXVECTOR3* pV2 / Right si
4、ded operand.);D3DXVECTOR3 u(1.0f, -1.0f, 0.0f);D3DXVECTOR3 v(3.0f, 2.0f, 1.0f);/ 1.0*3.0 + -1.0*2.0 + 0.0*1.0/ = 3.0 + -2.0float dot = D3DXVec3Dot( / = 1.0D3DXVECTOR3 *D3DXVec3Cross(D3DXVECTOR3* pOut, / Result.CONST D3DXVECTOR3* pV1, / Left sided operand.CONST D3DXVECTOR3* pV2 / Right sided operand.
5、);5.在D3D中如何表示一个4*4的矩阵。在D3D 中如何获得一个平移、旋转、比例变换矩阵。平移D3DXMATRIX *D3DXMatrixTranslation(D3DXMATRIX* pOut, / 返回平移后的矩阵. FLOAT x, / x轴移动的单位FLOAT y, / y轴移动的单位 FLOAT z / z轴移动的单位);旋转D3DXMATRIX *D3DXMatrixRotationX(D3DXMATRIX* pOut, / 返回旋转后的矩阵FLOAT Angle / Angle是旋转的弧度);比例D3DXMATRIX *D3DXMatrixScaling(D3DXMATRIX
6、* pOut, / 返回缩放后的矩阵FLOAT sx, / x轴缩放的比例FLOAT sy, / y轴缩放的比例FLOAT sz / z轴缩放的比例 .);6.如果一个物体先向X 轴正向平移5个单位,然后绕Y轴旋转45度并整体放大2倍,请求出该物体对应的旋转矩阵。7.已知平面的一个点P0以及垂直于该平面的一条法向矢量n ,请表示出该平面,并采用适当的程序创建该平面。该平面为p点的集合,n*(p-p0)=0;这里a, b和c是平面法向量n的成员,d就是那个常数。8.如何判断一个点是否在某个平面上?例如,假设平面(n, d),我们能判定点p和平面的关系:假如np + d = 0,那么点p与平面共面
7、。假如np + d 0,那么点p在平面的前面且在平面的正半空间里。假如np + d GetDesc(/ 取得被锁定表面的像素数据的指针D3DLOCKED_RECT lockedRect;/ 假定_surface是一个指向IDirect3DSurface9接口的指针/ 假定每个像素为:32-bit的像素格式/ 取得表面描述D3DSURFACE_DESC surfaceDesc;_surface-GetDesc(/ 取得被锁定表面的像素数据的指针D3DLOCKED_RECT lockedRect;_surface-LockRect(/ 0表示没有指定锁定标记/ 遍例表面上的每个像素,将它们设为红色
8、DWORD* imageData = (DWORD*)lockedRect.pBits;for(int i = 0; i UnlockRect();11.多重采样对图形的显示有何影响?由于使用像素矩阵来表示图像,在显示时会出现锯齿状,Multisampling就是使其变得平滑的技术。它的一种最普通的用法即为全屏抗锯齿。12.D3D中像素的格式有哪些?请举例说明。像素格式是由D3DFORMAT枚举类型的一个成员来定义的D3DFMT_R8G8B8表示一个24位像素,从左开始,8位分配给红色,8位分配给绿色,8位分配给蓝色。D3DFMT_X8R8G8B8表示一个32位像素,从左开始,8位不用,8位分
9、配给红色,8位分配给绿色,8位分配给蓝色。D3DFMT_A8R8G8B8表示一个32位像素,从左开始,8位为ALPHA 通道,8位分配给红色,8位分配给绿色,8位分配给蓝色。D3DFMT_A16B16G16R16F表示一个64位浮点像素,从左开始,16位为ALPHA 通道,16位分配给蓝色,16位分配给绿色,16位分配给红色。D3DFMT_A32B32G32R32F表示一个128位浮点像素,从左开始,32位为ALPHA 通道,32位分配给蓝色,32位分配给绿色,32位分配给红色。13.内存、显存以及AGP存储区有何区别?在程序中读取显存和AGP内存都是非常慢的。因此,假如你在运行时需要读取你的
10、几何物体,最好的方案是指定一块系统内存,都在其中拷贝并且读取数据14.深度缓存有什么作用,他存储了什么信息?深度缓冲也是一个表面,但它不是用来存储图像数据的,而是用来记录像素的深度信息。它将确定哪一个像素最后被绘制出来。深度缓冲为每一个像素计算深度值,并进行深度测试。通过深度测试,我们可以比较出哪个像素离照相机更近,并将它画出来。这样就可以只绘制最靠近照相机的像素,被遮住的像素就不会被画出来。15.如何检测某显示卡是否支持硬件顶点运算?bool supportsHardwareVertexProcessing;/ 如果为真,意味着硬件设备支持它if( caps.DevCaps else/ 不支
11、持 hardwareSupportsVertexProcessing = false;16.如何实现Direct3D的初始化,需要完成哪些工作?根据下边的步骤你能初始化Direct3D:1 获得一个IDirect3D9接口指针。这个接口用于获得物理设备的信息和创建一个IDirect3DDevice9接口,它是一个代表我们显示3D 图形的物理设备的C+对象。2 检查设备能力(D3DCAPS9),搞清楚主显卡是否支持硬件顶点处理。我们需要知道假如它能支持,我们就能创建IDirect3DDevice9接口。3 初始化一个D3DPRESENT_PARAMETERS结构实例,这个结构包含了许多数据成员允
12、许我们指定将要创建的IDirect3DDevice9接口的特性。4 创建一个基于已经初始化好的D3DPRESENT_PARAMETERS结构的IDirect3DDevice9对象。它是一个代表我们显示3D 图形的物理设备的C+对象。17.在D3D中顶点如何表示,并举例说明。struct ColorVertex float _x, _y, _z; / 位置DWORD _color; / 颜色 ;struct NormalTexVertex float _x, _y, _z; / 位置float _nx, _ny, _nz; / 法线向量float _u, _v; / 纹理坐标;18.在D3D中顶
13、点索引如何表示,并举例说明。我们创建一个顶点列表和一个索引列表(index list) 。顶点列表包含所有不重复的顶点,索引列中则用顶点列中定义的值来表示每一个三角形的构造方式。回到那个矩形的示例上来,它的顶点列表的构造方式如下:Vertex vertexList4 = v0, v1, v2, v3;索引列表则定义顶点列中的顶点是如何构造这两个三角形的:WORD indexList6 = 0, 1, 2, /三角形00, 2, 3; /三角形1也就是说,用顶点列表中的 0(vertexList0) 、1(vertexList1)和2(vertexList2)顶点构成三角形 0;用顶点列表中的
14、0( vertexList0) 、2(vertexList2)和 3(vertexList3)顶点构成三角形 1。19.请简要说明摄像摆放的位置和方向 ,裁剪面的大小对观察 3D场景中的物体有何影响?20.物体局部坐标系在游戏设计中有何用处 ? 为什么有了全局坐标系后还需要有世界坐标系和观察坐标系?自身坐标系简化了建模的过程。在物体自己的坐标系中建模比在世界坐标系中直接建模更容易。例如,在自身坐标系中建模不像在世界坐标系中要考虑本物体相对于其他物体的位置、大小、方向关系。我们需要把它们都放到同一个世界坐标系中,世界变换通常是用平移、旋转、缩放操作来设置模型在世界坐标系中的位置、大小、方向。世界
15、变换就是通过各物体在世界坐标系中的位置、大小和方向等相互之间的关系来建立所有物体。在世界坐标系中当照相机是任意放置和定向时,投影和其它一些操作会变得困难或低效。为了使事情变得更简单,我们将照相机平移变换到世界坐标系的源点并把它的方向旋转至朝向Z 轴的正方向。21.编写简单程序实现将局部坐标系转换成世界坐标系 ,以及如何将世界坐标系转换成观察坐标系./创建立方体的世界矩阵(一个平移矩阵)D3DXMATRIX cubeWorldMatrix;D3DXMatrixTranslation(/创建球体的世界矩阵(一个平移矩阵)D3DXMATRIX sphereWorldMatrix;D3DXMatrix
16、Translation(/ 变换立方体,然后绘制它Device-SetTransform(D3DTS_WORLD, drawCube(); / draw the cube/ 因为球体使用一个不同的世界变换,我们必须更改世界矩阵为球体的,/ 如果不更改,球体将绘制在上一个世界矩阵的位置上(立方体的世界矩阵)Device-SetTransform(D3DTS_WORLD, drawSphere(); / 绘制球体D3DXMATRIX *D3DXMatrixLookAtLH(D3DXMATRIX* pOut, / 指向返回的视图矩阵CONST D3DXVECTOR3* pEye, / 照相机在世界坐
17、标系的位置CONST D3DXVECTOR3* pAt, / 照相机在世界坐标系的目标点CONST D3DXVECTOR3* pUp / 世界坐标系的上方向(0, 1, 0);D3DXVECTOR3 position(5.0f, 3.0f, 10.0f);D3DXVECTOR3 targetPoint(0.0f, 0.0f, 0.0f);D3DXVECTOR3 worldUp(0.0f, 1.0f, 0.0f);D3DXMATRIX V;D3DXMatrixLookAtLH(22.描述一个投影矩阵需要有哪些参数 ,这些参数有什么含义 ?D3DXMATRIX *D3DXMatrixPerspec
18、tiveFovLH(D3DXMATRIX* pOut, / 返回的投影矩阵FLOAT fovY, / 用弧度表示的视野角度vertical field of view angle in radiansFLOAT Aspect, / 宽高比FLOAT zn, / 前裁剪面距离FLOAT zf / 后裁剪面距离);23.如何创建一个顶点缓存和一个索引缓存 ,在对相应的缓存进行读写操作前必须首先做什么?HRESULT IDirect3DDevice9:CreateVertexBuffer(UINT Length,DWORD Usage,DWORD FVF,D3DPOOL PoolIDirect3DV
19、ertexBuffer9* ppVertexBuffer,HANDLE* pSharedHandle);HRESULT IDirect3DDevice9:CreateIndexBuffer(UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer9* ppIndexBuffer,HANDLE* pSharedHandle);我们通过一个指针获得缓存数据必须使用Lock方法。当我们访问完缓存后必须对它解锁。一旦有一个指向内存的指针,我们就能对它进行读写。24.如何使用顶点缓存和索引缓存绘制相应的物体 ,绘制前必须首先完成什么工作 ?1、 设置资源流。设置资源流与一个顶点缓存挂钩,此流就是一个流入渲染管线的几何信息的流。下面的方法是用于设置一个资源流: