动漫游戏开发技术习题集1.向量有哪些重要属性?举例说明,在3D游戏中向量的作用。向量的两个重要属性是长度和方向。在3D游戏中可以表示例子的速度和加速度,光线的走向,多边形的朝向。2.向量的数学表示方法以及在D3D中采用何种结构体来表示一个三维向量。数学表示方法:N=(Nx,Ny,Nz)。D3D中typedefstructD3DVECTOR{floatx,y,z;}D3DVECTOR;3.向量长度的计算方法以及如何在D3D中计算向量的长度。||u||=sqrt(Ux*Ux+Uy*Uy+Uz*Uz)在D3D中,FLOATD3DXVec3Length(CONSTD3DVECTOR3*pV);D3DXVECTOR3v(1.0f,2.0f,3.0f);floatmagnitude=D3DXVec3Length(&v);//=sqrt(14)4.向量的加、减,数乘、点积、叉积运算方法,并用简单的程序实现上述运算。;D3DXVECTOR3u(2.0f,0.0f,1.0f);D3DXVECTOR3v(0.0f,-1.0f,5.0f);//(2.0+0.0,0.0+(-1.0),1.0+5.0)D3DXVECTOR3sum=u+v;//=(2.0f,-1.0f,6.0f)D3DXVECTOR3u(2.0f,0.0f,1.0f);D3DXVECTOR3v(0.0f,-1.0f,5.0f);D3DXVECTOR3difference=u-v;//=(2.0f,1.0f,-4.0f)D3DXVECTOR3u(1.0f,1.0f,-1.0f);D3DXVECTOR3scaledVec=u*10.0f;//=(10.0f,10.0f,-10.0f)FLOATD3DXVec3Dot(//Returnstheresult.CONSTD3DXVECTOR3*pV1,//Leftsidedoperand.CONSTD3DXVECTOR3*pV2//Rightsidedoperand.);D3DXVECTOR3u(1.0f,-1.0f,0.0f);D3DXVECTOR3v(3.0f,2.0f,1.0f);//1.0*3.0+-1.0*2.0+0.0*1.0//=3.0+-2.0floatdot=D3DXVec3Dot(&u,&v);//=1.0D3DXVECTOR3*D3DXVec3Cross(D3DXVECTOR3*pOut,//Result.CONSTD3DXVECTOR3*pV1,//Leftsidedoperand.CONSTD3DXVECTOR3*pV2//Rightsidedoperand.);5.在D3D中如何表示一个4*4的矩阵。在D3D中如何获得一个平移、旋转、比例变换矩阵。平移D3DXMATRIX*D3DXMatrixTranslation(D3DXMATRIX*pOut,//返回平移后的矩阵.FLOATx,//x轴移动的单位FLOATy,//y轴移动的单位FLOATz//z轴移动的单位);旋转D3DXMATRIX*D3DXMatrixRotationX(D3DXMATRIX*pOut,//返回旋转后的矩阵FLOATAngle//Angle是旋转的弧度);比例D3DXMATRIX*D3DXMatrixScaling(D3DXMATRIX*pOut,//返回缩放后的矩阵FLOATsx,//x轴缩放的比例FLOATsy,//y轴缩放的比例FLOATsz//z轴缩放的比例.);6.如果一个物体先向X轴正向平移5个单位,然后绕Y轴旋转45度并整体放大2倍,请求出该物体对应的旋转矩阵。7.已知平面的一个点P0以及垂直于该平面的一条法向矢量n,请表示出该平面,并采用适当的程序创建该平面。该平面为p点的集合,n*(p-p0)=0;这里a,b和c是平面法向量n的成员,d就是那个常数。8.如何判断一个点是否在某个平面上?例如,假设平面(n,d),我们能判定点p和平面的关系:假如n·p+d=0,那么点p与平面共面。假如n·p+d>0,那么点p在平面的前面且在平面的正半空间里。假如n·p+d<0,那么点p在平面的背面且在平面的负半空间里。9.编写简短程序判断某计算机是否支持顶点和像素着色。boolsupportsHardwareVertexProcessing;//如果为真,意味着硬件设备支持它if(caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT){//支持supportsHardwareVertexProcessing=true;}Else{//不支持hardwareSupportsVertexProcessing=false;}10.在D3D中表面的含义是什么?用什么来描述表面?编写程序将表面存储区中的每个像素设置为蓝色。表面是一个像素点阵,在代码中,我们可以使用IDirect3DSurface9接口来描述表面。//假定_surface是一个指向IDirect3DSurface9接口的指针//假定每个像素为:32-bit的像素格式//取得表面描述D3DSURFACE_DESCsurfaceDesc;_surface->GetDesc(&surfaceDesc);//取得被锁定表面的像素数据的指针D3DLOCKED_RECTlockedRect;//假定_surface是一个指向IDirect3DSurface9接口的指针//假定每个像素为:32-bit的像素格式//取得表面描述D3DSURFACE_DESCsurfaceDesc;_surface->GetDesc(&surfaceDesc);//取得被锁定表面的像素数据的指针D3DLOCKED_RECTlockedRect;_surface->LockRect(&lockedRect,//指向被锁定表面的数据0,//0表示锁定全部表面0);//0表示没有指定锁定标记//遍例表面上的每个像素,将它们设为红色DWORD*imageData=(DWORD*)lockedRect.pBits;for(inti=0;i